使用链式附加和使用多个+进行连接之间有什么区别

时间:2020-03-09 06:04:06

标签: 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建议我使用第一种方法,它们在线程安全性或类似方面是否有区别?

3 个答案:

答案 0 :(得分:0)

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

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

这显然不是最佳选择,而第一个版本保持不变。

答案 1 :(得分:0)

您的第一个方法将不会创建任何对象,但已创建的3个对象除外。但是,第二种方法将不必要地先创建另一个对象作为字符串(str1 + str2),然后追加到StringBuilder对象。

第一种方法比第二种方法好。

答案 2 :(得分:0)

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

String concatenation = str1 + str2 + str3;

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

StringBuilder允许您放置要连接的所有String,而无需创建中间对象。然后,当您准备就绪时,就可以得出最终结果。

如果在一个循环中连接多个String,则应使用StringBuilder。如果只想连接几个String,则不应该使用StringBuilder,因为它的创建成本大于中间String的成本。 通过写这样的东西

sb.append(str1 + str2);

您显然缺少StringBuilder的要点。要么只对这两个字符串执行此操作,这意味着您不必要创建StringBuilder对象,或者在循环中执行它,这意味着您不必要创建中间的str1 + str2对象。