2011-10-25 46 views
11

这两行有什么区别?StringBuilder追加vs +

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

假设计数器的递增INT,并在第一行创建一个字符串"Text 0 more text""Text 1 more text",每次它的名字,而第二行创建只有这两个字符串一次时间等:"Text "" more text"?它是否正确?

回答

15

简而言之,是的,除了每次对"Text "" more text"重复使用相同的字符串文字。

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

相比之下,第一种变体创建另一个 - 无名 - StringBuilder,三个组成部分写进去,要求其toString()方法并将结果写入到指定stringBuilder

总之,第一个变体创建一个额外的StringBuilder对象和一个额外的String对象,并且复制字符串数据比第二个变体多两次。

3

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

事实上,第二个并没有创建新的字符串,因为它每次都重复使用相同的字符串。它将使用“文本”和“更多文本”字符串的实际版本。

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

1

是的,你的解释是(几乎)正确的。

第一行总是创建String对象像"Text 0 more text",而第二不创建这样一个String对象。

第二行不创建 * *任何在所有"Text "" more text"String对象是String文字是 GET重新创建每次执行该行的时间。他们只创建一次。

然而,对stringBuilder的影响在两种情况下都完全相同。

1

这几乎是正确的。

我会说更多。由于java字符串缓存所有硬编码字符串,因此字符串“Text”和“more text”的实例不会在每次迭代中创建。

1

这取决于Java是否实施了字符串,但它仍然效率低下。如果你使用.append(“String”+ something +“String”),你可以强制Java创建一堆新的字符串,这样它最终可以添加到最后一个字符串中缓冲。这是一个经常错过的内存管理器,通过消除这种类型的代码,我已经看到web应用程序的内存使用量显着提高。