关于string:何时在Java中使用StringBuilder

When to use StringBuilder in Java

本问题已经有最佳答案,请猛点这里访问。

一般来说,在Java中使用Encx1与0的字符串连接是最好的。情况总是这样吗?

我的意思是:创建一个StringBuilder对象的开销,调用append()方法,最后调用toString()已经更小了,然后将现有的字符串与+运算符连接起来作为两个字符串,还是只建议使用两个以上的字符串?

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

最后,您是否愿意将+连接的可读性和简洁性与StringBuilder在较小的情况下(如两个、三个或四个字符串)的性能进行权衡?

在常规的连接优化中,使用EDCOX1的0度是过时的Java优化技巧以及Java城市神话。


如果在循环中使用字符串串联,类似于这样,

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

然后,您应该使用EDOCX1(不是StringBuffer)而不是String,因为它更快,占用的内存更少。

如果你只有一句话,

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

然后您可以使用String,因为编译器将自动使用StringBuilder


拉尔夫的回答令人难以置信。我宁愿使用StringBuilder类来构建/修饰字符串,因为它的使用更像是构建器模式。

1
2
3
4
5
6
7
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();
}

它可以用作帮助器/生成器来构建字符串,而不是字符串本身。


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

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


请看:http://www.javaspecialists.eu/archive/issue068.html和http://www.javaspecialists.eu/archive/issue105.html

在您的环境中执行相同的测试,并检查更新的JDK或Java实现是否使用EDOCX1·0更好地使用某种类型的字符串操作,或者更好地使用EDCOX1(1)。


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


对于两个字符串concat更快,在其他情况下,stringbuilder是更好的选择,请参阅concatenation operator(+)与concat()中的说明。


+运算符在内部使用public String concat(String str)。此方法复制两个字符串的字符,因此它具有与两个字符串长度成比例的内存需求和运行时复杂性。StringBuilder的工作效率更高。

不过,我在这里读到,使用+操作符的连接代码在后Java 4编译器上被更改为StrugBuudor。所以这可能根本不是问题。(不过,如果我在代码中依赖于此语句,我会检查它!)


字符串串联的问题是,它会导致复制字符串对象,并产生所有相关的成本。StringBuilder不是线程安全的,因此比StrugBuffy更快,这是Java 5之前首选的选择。根据经验,不应该在循环中进行字符串连接,这将经常被调用。我想在这里做一些连接不会伤害到您,只要您不谈论数百个,这当然取决于您的性能需求。如果你在做实时的事情,你应该非常小心。


微软认证材料也解决了这个问题。在.NET世界中,StringBuilder对象的开销使得2个字符串对象的简单连接更加高效。对于Java字符串,我会给出类似的答案。