6

我在另一篇文章中看到了这种字符串构建方法,该方法已被删除。

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

为什么会这样?

4

1 回答 1

18

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

我能想到的原因不止一个。首先是 Java 字符串是不可变的,当您执行 a+=来连接字符串时,会创建一个新的 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 标准库字符串连接功能的有趣观点做得更好。

于 2013-09-01T18:31:46.773 回答