在StringBuffer中追加或+运算符?

时间:2010-08-06 07:13:56

标签: java string

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

StringBuffer str = new StringBuffer();

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

所以我对使用append方法和+运算符感到困惑。

即以下代码可以写为

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

上面的两行是否相同?(功能是的但是)或者是否有任何特殊用途?即性能或可读性或???

感谢。

4 个答案:

答案 0 :(得分:15)

情况下,使用第一个表单更有效 - 因为编译器会将其转换为:

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

因为它连接了常量。

虽然有一些更普遍的观点:

  • 如果这些表达式中的任何一个不是常量,那么对append的两次调用最好(性能方面),以避免无缘无故地创建中间字符串
  • 如果您使用的是最新版本的Java,则通常首选StringBuilder
  • 如果您要立即附加一个字符串(并且您知道它在构造时是什么),您可以将它传递给构造函数

答案 1 :(得分:6)

实际上,字节码编译器将替换所有涉及调用StringBuffer的Java程序中非常量的字符串连接。那是

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

答案 2 :(得分:0)

第二种形式在性能方面最有效,因为只创建了一个字符串对象并将其附加到stringbuffer。 对于1)和2)的连接结果,第一种形式创建三个字符串对象1)用于“new”2)用于“new String”3)。并且第三个字符串对象连接到字符串缓冲区。

答案 3 :(得分:0)

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

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