StringBuilder append vs +

2022-09-03 00:55:42

这两条线有什么区别?

stringBuilder.append("Text " + counter + " more text");
stringBuilder.append("Text ").append(counter).append(" more text");

假设计数器是递增的 int,则第一行是否在每次调用时都会创建一个 String 、等,而第二行是否只创建这两个字符串一次:and ?这是正确的吗?"Text 0 more text""Text 1 more text""Text "" more text"


答案 1

简而言之,是的,除了相同的字符串文本每次都会被重用。"Text "" more text"

第二种变体效率更高,因为它将三个组件中的每一个直接写入 .StringBuilder

相比之下,第一个变体创建另一个 - 未命名-- ,将三个组件写入其中,调用其方法并将结果写入命名的.StringBuildertoString()stringBuilder

总之,第一个变体创建一个额外的对象和一个额外的对象,并将字符串数据复制为第二个变体的两倍。StringBuilderString


答案 2

是的,这(大部分)是正确的。

实际上,第二个字符串根本不会创建新字符串,因为它每次都会重用相同的字符串。它将使用“文本”和“更多文本”字符串的中间版本。

第一个将使用编译器生成的StringBuilder为“Text 1 more text”创建一个字符串,然后为“Text 2 more text”创建一个字符串。