在Java中使用StringBuilder进行字符串连接通常更可取。情况总是这样吗?

我的意思是:创建一个StringBuilder对象,调用append()方法和最后toString()的开销已经比连接现有的字符串与+操作符两个字符串更小,还是它只适用于更多(两个以上)字符串?

如果有这样一个阈值,它取决于什么(也许是字符串长度,但以哪种方式)?

最后,你是否愿意牺牲+连接的可读性和简便性来换取StringBuilder在较小情况下的性能,比如两个,三个或四个字符串?

在过时的Java优化技巧和Java都市神话中,显式地使用StringBuilder进行常规连接被认为是过时的。


当前回答

如果你在循环中使用字符串连接,就像这样,

String s = "";
for (int i = 0; i < 100; i++) {
    s += ", " + i;
}

那么你应该使用StringBuilder(不是StringBuffer)而不是String,因为它更快,占用的内存更少。

如果你有一个陈述,

String s = "1, " + "2, " + "3, " + "4, " ...;

那么你可以使用string,因为编译器会自动使用StringBuilder。

其他回答

对于两个字符串,concat更快,在其他情况下StringBuilder是更好的选择,请参阅我在连接运算符(+)vs concat()中的解释

拉尔夫的回答非常棒。我宁愿使用StringBuilder类来构建/装饰String,因为它的用法更像Builder模式。

public String decorateTheString(String orgStr){
            StringBuilder builder = new StringBuilder();
            builder.append(orgStr);
            builder.deleteCharAt(orgStr.length()-1);
            builder.insert(0,builder.hashCode());
            return builder.toString();
}

它可以作为一个助手/构建器来构建字符串,而不是字符串本身。

一些编译器可能不会用StringBuilder等价物替换任何字符串连接。在依赖编译时优化之前,一定要考虑源代码将使用哪些编译器。

作为一般规则,总是使用可读性更好的代码,只有在性能有问题时才重构。在这种特定情况下,最新的JDK实际上会在任何情况下将代码优化为StringBuilder版本。

通常只有在循环中进行字符串连接或在编译器无法轻松优化的复杂代码中才需要手动执行。

看看:http://www.javaspecialists.eu/archive/Issue068.html和http://www.javaspecialists.eu/archive/Issue105.html

在您的环境中进行相同的测试,并检查新的JDK或Java实现是否使用string或StringBuilder更好地执行某种类型的字符串操作。