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

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

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

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

我理解有些人建议使用StringBufferStringBuilder但这个链接说,它没有性能改进: StringBuilder vs Java中toString()的字符串连接

使用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(); 

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

您应该使用StringBufferStringBuilder

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

这个答案可能对你有用: 连接运算符(+)vs concat()

在讨论实际问题之前,请查看内部连接的工作原理。

 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次循环是要考虑的下降性能阻塞。

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

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