【问题标题】:Java - how many string concat's should prompt the use of StringBuilder? [duplicate]Java - 有多少字符串 concat 应该提示使用 StringBuilder? [复制]
【发布时间】:2013-03-19 14:55:55
【问题描述】:

我知道 StringBuilder 应该用于连接多个字符串,而不是使用 +。我的问题是什么是截止点?

有人告诉我,如果连接 4 个或更多字符串,您应该使用 StringBuilder.append(),而对于其他任何事情,请使用 +。 是这样吗?还是 stringbuilder 比 4 更有效的点?

【问题讨论】:

标签: java string stringbuilder


【解决方案1】:

从 Java 1.5 开始,当在源代码中使用 + 时,编译器会自动使用 StringBuilder

来自Javadoc for String

Java 语言为字符串连接运算符 ( + ) 以及将其他对象转换为字符串提供了特殊支持。字符串拼接是通过StringBuilder(或StringBuffer)类及其append方法实现的。

【讨论】:

    【解决方案2】:

    零。

    许多年前,在遥远的 Java 版本 (1.4) 中,有人建议用 StringBuffer 替换串联(StringBuilder 的线程安全等价物,尚未发明)。

    随着StringBuilder 的引入,以及在更快的StringBuilder 方面重新定义连接,使用StringBuffer 的“优化”代码会导致不必要的同步,而使用+ 的非优化代码会自动享受受益于StringBuilder

    当连接与控制结构或循环混合时,或者当我需要更新字符串中间的某些字符时,我会使用StringBuilder。否则,我假设编译器足够聪明,可以很好地处理传统的串联。

    【讨论】:

      【解决方案3】:

      从 jse 5 开始,+ 号在编译期间转换为字符串生成器。

      这里有一个警告,这个:

      String blam = a + b + c + d + e;
      

      产生一个字符串生成器和 5 个附加(如预期的那样)

      这个;但是:

      String blam = a;
      blam += b + c;
      blam := d + e;
      

      产生 3 个字符串生成器(每行一个)。

      点:+号就可以了,一行代码就全部堆叠起来。

      【讨论】:

      • 事实上,在循环中,它为每个 concat 创建了一个字符串构建器,这可能很多。在循环中 catting 的情况下,您可能应该在其顶部定义构建器并在每次迭代时追加。
      • 正确。不要在循环内进行字符串连接。
      【解决方案4】:

      我会说编译器会将加号替换为 StringBuilder 本身。

      在这种情况下,您需要避免几种情况。例如在循环中使用 +。每次迭代都会创建一个新的StringBuilder

      可能想读这个question

      【讨论】:

        【解决方案5】:

        编译器非常擅长优化这些东西,所以通常你不会有太多收获。但是,例如,如果您在循环中进行连接,您可能会从使用 StringBuilder 中获得一些好处。

        【讨论】:

          【解决方案6】:

          没有定义答案,因为它取决于JVM 的实现。当我需要连接超过 3 个字符串时,我使用 StringBuilder

          我注意到一个很好的案例。当您需要连接static final String 时,您不必使用StringBuilder。编译器会在性能下降的情况下连接它:

          final class Example {
          
              public static final String STRING_ONE = "string";
              public static final String STRING_TWO = "string";
              public static final String STRING_THREE = "string";
              public static final String STRING_FOUR = "string";
          
              public String getBigString() {
                  return STRING_ONE + STRING_TWO + STRING_THREE + STRING_FOUR;    
              } 
          
          }
          

          我也对这个问题很感兴趣。我试图实现一个好的测试并询问了here

          【讨论】:

            猜你喜欢
            • 2011-12-01
            • 2011-12-10
            • 1970-01-01
            • 2015-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-09
            • 2010-10-29
            相关资源
            最近更新 更多