代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

在StringBuffer中追加或+运算符?

  •  4
  • GuruKulki  · 技术社区  · 14 年前

    在我的项目中,有一些代码片段使用了StringBuffer对象,其中的一小部分如下所示

    StringBuffer str = new StringBuffer();
    
    str.append("new " + "String()");
    

    所以我对append方法和+操作符的使用感到困惑。

    即以下代码可以写为

    str.append("new ").append("String()");
    

    那么上面的两行是相同的吗?(功能上是的,但是)或者它们有什么特别的用法吗?IE性能或可读性还是????

    谢谢。

    4 回复  |  直到 14 年前
        1
  •  15
  •   Jon Skeet    14 年前

    那个 case使用第一个表单更有效-因为编译器会将其转换为:

    StringBuffer str = new StringBuffer();
    str.append("new String()");
    

    因为它连接常量。

    不过,还有一些更一般的观点:

    • 如果这两个表达式中的任何一个不是常量,那么对 append ,以避免无缘无故创建中间字符串
    • 如果您使用的是Java的最新版本, StringBuilder 通常优先考虑
    • 如果要立即附加一个字符串(并且您知道它在构造时是什么),可以将其传递给构造函数。
        2
  •  6
  •   Community CDub    8 年前

    实际上,字节码编译器将调用包含Java程序中的非常量的所有字符串级联调用。 StringBuffer . 那就是

    int userCount = 2;
    System.out.println("You are the " + userCount + " user");
    

    将重写为

    int userCount = 2;
    System.out.println(new StringBuffer().append("You are the ").append(userCount).append(" user").toString());
    

    这至少是在解压缩JDK 5或6编译的Java类文件时所能观察到的。见 this post .

        3
  •  0
  •   Balaji Natesan    14 年前

    第二个表单在性能方面效率最高,因为只有一个字符串对象被创建并附加到StringBuffer。 第一个表单创建三个字符串对象1)对于“new”2)对于“new string”3)对于1)和2)的连接结果。第三个字符串对象连接到字符串缓冲区。

        4
  •  0
  •   BjornS    14 年前

    除非您使用的是并发系统,否则请使用StringBuilder而不是StringBuffer。它的速度更快,但不是线程安全:)

    它还共享相同的API,因此它或多或少是直接查找/替换-