【问题标题】:Using += for strings in a loop, is it bad practice?在循环中对字符串使用 += 是不好的做法吗?
【发布时间】:2013-09-04 20:47:50
【问题描述】:

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

其中一位 cmets 将这种做法描述为“职业限制”

为什么会这样?

【问题讨论】:

  • 我的意思是,这通常是一种糟糕的编码习惯吗?但是这个问题与关于 java 的帖子有关
  • 任何特定的语言结构只有在以一种无法维护、有缺陷或性能不佳的代码的方式使用时才会成为“职业限制”。使用“+=”进行字符串操作不一定会证明任何这些问题(取决于了解您正在使用的语言以及是否存在性能或内存问题),因此如果公司要根据“+”的方式进行招聘="已使用,我可能会寻找另一家公司工作。

标签: string loops concatenation


【解决方案1】:

假设您在这里谈论 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 做得更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2018-10-19
    • 2017-02-02
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多