我在循环中连接一个字符串,但这需要很长时间,为什么会这样?
for (String object : jsonData) {
counter++;
finalJsonDataStr += object;
}
变量object
是一段JSON,最多70个字符,循环次数约为50k次。
我理解某些人的建议StringBuffer
或StringBuilder
但是此链接说明,它没有改善绩效:StringBuilder vs String concatenation in toString() in Java
答案 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();
50K次循环是需要考虑的下降性能阻止器。
在这种情况下,使用StringBuilder
和append方法。原因concat(+)每次新建一个String Builder对象时都会创建一个新对象。这导致50k物体创作。
使用单个StringBuilder和append方法,您可以节省创建异议的时间以及内存。
答案 2 :(得分:0)
您应该使用StringBuffer
或StringBuilder
。
使用plus添加字符串时,会创建StringBuilder
,连接字符串并使用toString()
的{{1}}方法返回新的字符串。因此将此对象创建和字符串操作映像50k次。如果你自己只实例化一个StringBuilder
并且只是附加字符串就好了......