Java 追加或+;StringBuffer中的运算符?

Java 追加或+;StringBuffer中的运算符?,java,string,Java,String,在我的项目中,有一些使用StringBuffer对象的代码片段,其一小部分如下 StringBuffer str = new StringBuffer(); str.append("new " + "String()"); 因此,我对append方法和+运算符的使用感到困惑 ie下面的代码可以写成 str.append("new ").append("String()"); int userCount = 2; System.out.println(new StringBuffer().a

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

StringBuffer str = new StringBuffer();

str.append("new " + "String()");
因此,我对append方法和+运算符的使用感到困惑

ie下面的代码可以写成

str.append("new ").append("String()");
int userCount = 2;
System.out.println(new StringBuffer().append("You are the ").append(userCount).append(" user").toString());
那么上面的两行是相同的吗?(功能上是的,但是)或者它们有什么特殊的用法吗?ie性能、可读性还是

谢谢。

在这种情况下,使用第一种形式更有效-因为编译器会将其转换为:

StringBuffer str = new StringBuffer();
str.append("new String()");
因为它连接常量

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

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

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

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

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

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

这至少是在反编译用JDK 5或6编译的java类文件时可以观察到的。请参阅。

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


它也共享相同的API,所以它或多或少是一个直接的查找/替换-

只是出于更多的原因-StringBuilder是首选的,因为它没有同步(速度更快)。我相信你不理解这个问题。是的,我想我的回答可能有点仓促。