在循环中使用+ =表示字符串,这是不好的做法吗?

时间:2013-09-01 18:18:27

标签: string loops concatenation

我看到这个字符串构建方法在另一个帖子中使用,后来被删除了。

其中一条评论将这种做法描述为“职业限制”

为什么会这样?

1 个答案:

答案 0 :(得分:6)

我假设您在这里谈论Java,我会回答。

我能想到不止一个原因。第一个是Java字符串是不可变的,当你用+=连接字符串时,会创建一个新的String对象,并将对它的引用赋给你的字符串变量。

所以当你这样做时:

for (int i = 0; i < 100; i++)
    myString += ...blah...

您正在创建100个新的字符串对象。请注意,旧版本确实会去任何地方,所以它们最终会被垃圾收集一段时间,因为我们没有存储对它们的引用。但是,这仍然不太好,因为垃圾收集需要时间,并且堆中有太多对象会降低应用程序的速度。此外,如果您不打算使用它们,为什么要创建这么多对象。

更好的解决方案当然是使用StringBuilder;

StringBuilder myString = new StringBuilder();
for (int i = 0; i < 100; i++)
    myString.append(...blah...);
String s = myString.toString();

另一个原因可能是,如果您已经知道需要追加哪些字符串(或者至少估计总大小),您可以预分配空间,以便新空间不会当你的字符串变大时,不时需要分配。

最后,您可以使用char的数组,预分配空间,并使用Joel Spolsky对C的标准库字符串连接功能所做的this interesting point做得更好。