【问题标题】:String builder vs string concatenation [duplicate]字符串生成器与字符串连接[重复]
【发布时间】:2013-08-29 11:50:44
【问题描述】:

与纯字符串连接相比,使用字符串构建器的好处和权衡是什么?

new StringBuilder(32).append(str1)
                     .append(" test: ")
                     .append(val)
                     .append(" is changed")
                     .toString();

vs 说

str1 + " test: " + val + " is changed".

str1 是一个随机的 10 个字符的字符串。 str2 是一个随机的 8 个字符的字符串。

【问题讨论】:

  • 在您的简单示例中,可能没有任何好处。 StringBuilders 很有用,因为当您使用 + 连接时,每次连接时都会创建全新的字符串。因此,StringBuilder 可以更有效地连接大量字符串。

标签: java stringbuilder string-concatenation


【解决方案1】:

在您的特定示例中,没有,因为编译器在内部使用 StringBuilders 进行字符串连接。但是,如果连接发生在循环中,编译器可能会创建多个 StringBuilderString 对象。例如:

String s= "" ;
for(int i= 0 ; i < 10 ; i++ )
    s+= "a" ;

每执行一次上面的第3行,就会创建一个新的StringBuilder对象,追加s的内容,追加“a”,然后将StringBuilder转换成String赋值回@ 987654328@。共有 10 个StringBuilders 和 10 个Strings。

反之,在

StringBuilder sb= new StringBuilder() ;
for(int i= 0 ; i < 10 ; i++ )
    sb.append( "a" );
String s= sb.toString() ;

仅创建 1 个StringBuilder 和 1 个String

主要原因是编译器不够聪明,无法理解第一个循环等同于第二个循环并生成更高效的(字节)代码。在更复杂的情况下,即使是最聪明的编译器也不可能知道。如果你绝对需要这种优化,你必须通过显式使用StringBuilders 手动引入。

【讨论】:

    【解决方案2】:

    快速回答是性能: 当您使用本机 String 类时,它会操作不可变字符串,这意味着当您在编写时

      String line = "java";
      String sufix = " is awesome";
      line = line + sufix;
    

    它将创建两个字符串“java”和“is awesome”,而不是从前两个字符串(“java”和“is awesome”)创建一个新的第三个字符串“java is awesome”,稍后可能会被删除垃圾收集器(因为它们不再在应用程序中使用)。这是一个缓慢的解决方案。

    更快的解决方案是 StringBuffer 类的一个装置,它通过智能算法提供一个缓冲区(从它的名字可以明显看出)用于合并字符串,因此在连接过程中不会删除初始字符串。

    如果您正在编写单线程应用程序(在多个线程访问同一对象期间没有并发问题),最好应用 StringBuilder,它的性能比初始 StringBuffer 类更快。

    【讨论】:

    • 您好,像线程安全的数据结构,您建议在多线程执行中使用线程安全版本的 String Builder 吗?
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2021-06-20
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多