代码之家  ›  专栏  ›  技术社区  ›  Chun ping Wang

字符串生成器与字符串串联[重复]

  •  28
  • Chun ping Wang  · 技术社区  · 12 年前

    与纯字符串串联相比,使用字符串生成器的好处和权衡是什么?

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

    vs说

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

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

    2 回复  |  直到 11 年前
        1
  •  53
  •   Mario Rossi    7 年前

    在您的特定示例中,由于编译器内部使用 StringBuilder s进行字符串串联。然而,如果串联发生在循环中,编译器可以创建几个 字符串拼接 String 物体。例如:

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

    每当执行上述第3行时 字符串拼接 对象的内容 s 附加,“a”附加,然后 字符串拼接 转换为要分配回的字符串 s 。共10个 字符串拼接 s和10 一串 s

    相反,在

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

    仅1个 字符串拼接 和1 一串 创建。

    这主要是因为编译器不够聪明,无法理解第一个循环相当于第二个循环,也无法生成更高效的(字节)代码。在更复杂的情况下,即使是最聪明的编译器也不可能知道。如果你绝对需要这种优化,你必须使用 字符串拼接 s明确表示。

        2
  •  5
  •   SMBiggs    10 年前

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

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

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

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

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

    推荐文章