为什么字符串连接需要这么长时间?

时间:2015-08-07 13:36:08

标签: java string concatenation string-concatenation

我在循环中连接一个字符串,但这需要很长时间,为什么会这样?

for (String object : jsonData) {
    counter++;
    finalJsonDataStr += object;
}

变量object是一段JSON,最多70个字符,循环次数约为50k次。

我理解某些人的建议StringBufferStringBuilder但是此链接说明,它没有改善绩效:StringBuilder vs String concatenation in toString() in Java

3 个答案:

答案 0 :(得分:7)

使用String Builder附加到字符串。

当你连接时,Java实际上是在创建一个带有连接结果的新String。 做多次,你无所事事地创造了大量的字符串。

尝试:

StringBuilder sb = new StringBuilder();
for (String object : jsonData) { 
    counter++; 
    sb.append(object.toString());  //this does the concatenation internally
                                   //but is very efficient
}

finalJsonDataStr = sb.toString(); //this gives you back the whole string 

<强>注:

当你做

这样的事情时
myString = "hello " + someStringVariable + " World!" + " My name is " + name;

编译器非常智能,可以用一个StringBuilder替换所有内容,例如:

myString = new StringBuilder("hello ")
                      .append(someStringVariable)
                      .append(" World!")
                      .append(" My name is ")
                      .append(name).toString();

但由于某种原因我不知道,当连接发生在循环中时,它不会这样做。

答案 1 :(得分:0)

在讨论实际问题之前,请看内部连接是如何工作的。

String testString ="str"+"ingcon"+"catenation";  

如果我们将上面声明的String打印到控制台并看到,结果是stringconcatenation.Which是正确的+ +工作正常。这是实际问题,那个+符号是如何产生魔力的? ?这不是Strings的正常数学加法。下面的代码片段显示了+实际转换代码的方式。

 StringBuilder compilerGeneratedBuilder = new StringBuilder();  
 compilerGeneratedBuilder.append("str");  
 compilerGeneratedBuilder.append("ingcon");  
 compilerGeneratedBuilder.append("catenation");  
 String finalString = compilerGeneratedBuilder.toString(); 

Web Audio API specification

50K次循环是需要考虑的下降性能阻止器。

在这种情况下,使用StringBuilder和append方法。原因concat(+)每次新建一个String Builder对象时都会创建一个新对象。这导致50k物体创作。

使用单个StringBuilder和append方法,您可以节省创建异议的时间以及内存。

答案 2 :(得分:0)

您应该使用StringBufferStringBuilder

使用plus添加字符串时,会创建StringBuilder,连接字符串并使用toString()的{​​{1}}方法返回新的字符串。因此将此对象创建和字符串操作映像50k次。如果你自己只实例化一个StringBuilder并且只是附加字符串就好了......

这个答案对您有用:concatenation operator (+) vs concat()