什么时候在Java中使用StringBuilder
在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
。
拉尔夫的回答很棒。 我宁愿使用StringBuilder类来构建/装饰字符串,因为它的使用更像是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(); }
它可以用作帮助器/构建器来构建字符串,而不是字符串本身。
作为一般规则,请始终使用更易读的代码,并且只有在性能问题时才重构。 在这个特定情况下,最近的JDK实际上将代码优化成StringBuilder版本。
如果在循环中或者在编译器无法轻松优化的复杂代码中进行字符串连接,通常只需要手动执行。
看看: http : //www.javaspecialists.eu/archive/Issue068.html和http://www.javaspecialists.eu/archive/Issue105.html
在您的环境中执行相同的测试,并检查更新的JDK或Java实现是否使用String
更好地使用StringBuilder
进行某种类型的字符串操作。
一些编译器不能用StringBuilder等价物替换任何字符串连接。 在依靠编译时优化之前,一定要考虑你的源代码将使用哪个编译器。
+运算符在内部使用public String concat(String str)
。 这种方法复制了两个字符串的字符,所以它具有与两个字符串的长度成比例的存储器要求和运行时复杂度。 StringBuilder工作更有效率。
不过,我已经读过这里 ,在后期的Java 4编译器上,使用+操作符的concatination代码改为StringBuilder。 所以这可能不是一个问题。 (虽然我真的会检查这个声明,如果我依靠它在我的代码!)
对于两个字符串concat是更快的,在其他情况下StringBuilder是一个更好的选择,请参阅我的解释在串联运算符(+)vs concat()
字符串连接的问题是,它导致复制与所有相关的成本的字符串对象。 StringBuilder不是线程安全的,因此比StringBuffer更快,因为在Java 5之前,StringBuffer是首选。作为一个经验法则,你不应该在一个循环中进行字符串连接,这将经常被调用。 我想在这里做几个连接,只要你不是在谈论数百个,就不会伤害你,这当然取决于你的性能要求。 如果你正在做实时的事情,你应该非常小心。
微软认证资料解决了同样的问题。 在.NET世界中,StringBuilder对象的开销使得2个String对象的一个简单的连接效率更高。 我会假设对于Java字符串类似的答案。