有人告诉我,在java语言中使用StringBuffer
连接字符串比使用+
操作符连接String
更有效,当你这么做的时候会发生什么?StringBuffer
有什么不同之处?
发布于 2008-09-15 19:02:48
最好使用StringBuilder (它是一个非同步版本;什么时候可以并行构建字符串?)如今,几乎在每种情况下,都是这样的,但下面是发生的情况:
将+与两个字符串一起使用时,它会编译如下代码:
String third = first + second;
类似这样的东西:
StringBuilder builder = new StringBuilder( first );
builder.append( second );
third = builder.toString();
因此,对于一些小的例子来说,这通常不会有什么不同。但是当你构建一个复杂的字符串时,你通常需要处理比这更多的事情;例如,你可能要使用许多不同的附加语句,或者像下面这样的循环:
for( String str : strings ) {
out += str;
}
在这种情况下,在每次迭代中都需要一个新的StringBuilder
实例和一个新的String
( out
-String
的新值是不可变的)。这是非常浪费的。将其替换为单个StringBuilder
意味着您可以只生成单个String
,而不会用您不关心的String
来填满堆。
发布于 2008-09-15 18:57:07
其中一个不应该比另一个快。在Java1.4.2之前就不是这样了,因为当使用"+“操作符连接两个以上的字符串时,在构建最终字符串的过程中会创建中间的String
对象。
然而,正如JavaDoc for StringBuffer声明的那样,至少从Java1.4.2开始,使用"+“运算符编译为创建一个StringBuffer
并将许多字符串append()
到它。因此,显然没有区别。
但是,在循环中使用将字符串添加到另一个字符串时要小心!例如:
String myString = "";
for (String s : listOfStrings) {
// Be careful! You're creating one intermediate String object
// for every iteration on the list (this is costly!)
myString += s;
}
但是,请记住,通常将几个字符串与"+“连接起来要比将它们全部用append()
连接起来要干净。
发布于 2008-09-15 18:57:09
在幕后,它实际创建并附加到一个StringBuffer,对结果调用toString()。所以实际上你使用哪一个已经不重要了。
所以
String s = "a" + "b" + "c";
变成了
String s = new StringBuffer().append("a").append("b").append("c").toString();
这对于一条语句中的一堆内联追加来说是正确的。如果在使用多个语句的过程中构建字符串,则是在浪费内存,StringBuffer或StringBuilder是更好的选择。
https://stackoverflow.com/questions/65668
复制相似问题