为什么字符串连接需要这么长时间?
我在一个循环中连接一个字符串,但它需要很长时间,为什么呢?
for (String object : jsonData) { counter++; finalJsonDataStr += object; }
变量object
是一块JSON,最多70个字符,循环大约50k次。
我理解有些人建议使用StringBuffer
或StringBuilder
但这个链接说,它没有性能改进: 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();
但由于某些原因我不知道,当连接发生在循环中时,它不会这样做。
您应该使用StringBuffer
或StringBuilder
。
使用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方法,您可以节省创建异议的时间以及内存。