Java 什么';s使用链式追加和使用多个+;连接

Java 什么';s使用链式追加和使用多个+;连接,java,string,stringbuilder,Java,String,Stringbuilder,我试图在StringBuilder中附加多个字符串, 使用有什么主要区别吗 String str1 = "some"; String str2 = "string"; 现在, sb.append(str1).append(str2); // using chained appends 和使用 sb.append(str1 + str2); // using '+' operator 我的IDE建议我使用第一种方法,它们之间在线程安全或类似的方面有什么区别吗?在后台,编译器用StringBu

我试图在StringBuilder中附加多个字符串,
使用有什么主要区别吗

String str1 = "some";
String str2 = "string";
现在,

sb.append(str1).append(str2); // using chained appends
和使用

sb.append(str1 + str2); // using '+' operator

我的IDE建议我使用第一种方法,它们之间在线程安全或类似的方面有什么区别吗?

在后台,编译器用StringBuilder.append替换字符串连接,但有一些限制。在循环内部,它为每次迭代创建一个新的StringBuilder,调用toString并将其附加到外部StringBuilder。方法调用也是如此,因为它需要方法调用的值。编译后,您的第二个版本将为

sb.append(new StringBuilder().append(str1).append(str2).toString);

这显然不是最优的,而第一个版本保持不变。

您的第一个方法将不会创建任何对象,除非已经创建了3个对象。但是,第二种方法将不必要地首先为string装箱另一个对象(str1+str2),然后附加到StringBuilder对象


第一种方法优于第二种方法。

使用StringBuilder的目的是避免创建不必要的字符串对象。Java中的字符串是不可修改的,这意味着每次连接两个字符串时,都会创建第三个字符串。例如,下面的代码

String concatenation = str1 + str2 + str3;
导致创建不必要的字符串str1+str2,然后向其中添加str3,并将其结果分配给“连接”

StringBuilder允许您放置所有要连接的字符串,而无需创建中间对象。然后,当您准备好时,您将构建最终结果

如果在循环中连接多个字符串,则应使用StringBuilder。若您只想连接几个字符串,就不应该使用StringBuilder,因为它的创建成本大于中间字符串的成本。 写这样的东西

sb.append(str1 + str2);

您显然没有理解StringBuilder的要点。您可以只为这两个字符串执行此操作,这意味着您不需要创建StringBuilder对象,也可以在循环中执行此操作,这意味着您不需要创建中间str1+str2对象。

使用
StringBuilder
的原因是避免将许多未知(即非文字)字符串(例如在循环中)串接的开销. 尽管注意到字符串文本的连接是在编译时发生的(因此在这种情况下使用
StringBuilder
会更糟糕)。@Slaw那么我是否必须使用字符串连接而不是仅基于示例代码使用字符串builder,您应该执行
sb.append(“somestring”)
。这是否回答了您的问题?请考虑到,从Java 9开始,字符串连接的性能得到了显著提高(JEP 280),使用它而不是使用
StringBuilder
可能更明智。实际上,编译器足够聪明,可以将
str1+str2+str3
转换为
new StringBuilder()。append(str1).append(str2).append(str3)
。所以实际上没有创建额外的中间字符串。第二个版本确实会导致额外创建
StringBuilder
,因为字符串concat.with new Java version(>=9?)甚至中间的
StringBulder
也没有使用-编译器使用
StringConcatFactory
创建一个合成方法,用于将no
StringBuilder
与较新版本的Java连接起来-编译器使用
StringConcatFactory