【问题标题】:StringBuilder append vs +StringBuilder 追加 vs +
【发布时间】:2011-10-25 09:21:32
【问题描述】:
这两行有什么区别?
stringBuilder.append("Text " + counter + " more text");
stringBuilder.append("Text ").append(counter).append(" more text");
假设 counter 是一个递增的 int,第一行是否会在每次调用时创建一个字符串 "Text 0 more text"、"Text 1 more text" 等,而第二行只创建一次这两个字符串:"Text " 和 @987654325 @?这是正确的吗?
【问题讨论】:
标签:
java
string
performance
【解决方案1】:
简而言之,是的,只是 "Text " 和 " more text" 的相同字符串文字每次都会被重用。
第二个变体更有效,因为它将三个组件中的每一个都直接写入StringBuilder。
相比之下,第一个变体创建另一个--未命名--StringBuilder,将三个组件写入其中,调用其toString() 方法并将结果写入已命名的stringBuilder。
总之,第一个变体创建了一个额外的StringBuilder 对象和一个额外的String 对象,并且复制的字符串数据是第二个变体的两倍。
【解决方案2】:
是的,这是(大部分)正确的。
事实上,第二个根本不会创建新的字符串,因为它每次都重用相同的字符串。它将使用“文本”和“更多文本”字符串的实习版本。
第一个将使用编译器生成的 StringBuilder 为“Text 1 more text”然后“Text 2 more text”创建一个字符串。
【解决方案3】:
这几乎是正确的。
我会说更多。由于 java 字符串缓存所有硬编码字符串,因此不会在每次迭代时创建字符串“Text”和“more text”的实例。
【解决方案4】:
这取决于Java是否实习字符串,但它仍然是低效的。
字符串是不可变的,所以,如果你使用 .append("String" + something + "String"),你会强制 Java 创建一堆新的字符串,这样它就可以将最终的字符串添加到缓冲区中.这是一个经常被忽略的内存消耗,我已经看到通过消除这种类型的代码,Web 应用程序的内存使用得到了显着改善。
【解决方案5】:
是的,您的解释(几乎)是正确的。
第一行总是创建像"Text 0 more text" 这样的String 对象,而第二行不会创建这样的String 对象。
第二行没有创建 *any* String 对象,"Text " 和 " more text" 是 String 不得到的文字每次执行该行时重新创建。它们只创建一次。
不过,在两种情况下对stringBuilder 的影响完全相同。