首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Java中使用StringBuffer而不是字符串连接运算符

为什么在Java中使用StringBuffer而不是字符串连接运算符
EN

Stack Overflow用户
提问于 2008-09-15 18:55:48
回答 12查看 73.9K关注 0票数 59

有人告诉我,在java语言中使用StringBuffer连接字符串比使用+操作符连接String更有效,当你这么做的时候会发生什么?StringBuffer有什么不同之处?

EN

回答 12

Stack Overflow用户

发布于 2008-09-15 19:02:48

最好使用StringBuilder (它是一个非同步版本;什么时候可以并行构建字符串?)如今,几乎在每种情况下,都是这样的,但下面是发生的情况:

将+与两个字符串一起使用时,它会编译如下代码:

代码语言:javascript
复制
String third = first + second;

类似这样的东西:

代码语言:javascript
复制
StringBuilder builder = new StringBuilder( first );
builder.append( second );
third = builder.toString();

因此,对于一些小的例子来说,这通常不会有什么不同。但是当你构建一个复杂的字符串时,你通常需要处理比这更多的事情;例如,你可能要使用许多不同的附加语句,或者像下面这样的循环:

代码语言:javascript
复制
for( String str : strings ) {
  out += str;
}

在这种情况下,在每次迭代中都需要一个新的StringBuilder实例和一个新的String ( out -String的新值是不可变的)。这是非常浪费的。将其替换为单个StringBuilder意味着您可以只生成单个String,而不会用您不关心的String来填满堆。

票数 64
EN

Stack Overflow用户

发布于 2008-09-15 18:57:07

其中一个不应该比另一个快。在Java1.4.2之前就不是这样了,因为当使用"+“操作符连接两个以上的字符串时,在构建最终字符串的过程中会创建中间的String对象。

然而,正如JavaDoc for StringBuffer声明的那样,至少从Java1.4.2开始,使用"+“运算符编译为创建一个StringBuffer并将许多字符串append()到它。因此,显然没有区别。

但是,在循环中使用将字符串添加到另一个字符串时要小心!例如:

代码语言:javascript
复制
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()连接起来要干净。

票数 21
EN

Stack Overflow用户

发布于 2008-09-15 18:57:09

在幕后,它实际创建并附加到一个StringBuffer,对结果调用toString()。所以实际上你使用哪一个已经不重要了。

所以

代码语言:javascript
复制
String s = "a" + "b" + "c";

变成了

代码语言:javascript
复制
String s = new StringBuffer().append("a").append("b").append("c").toString();

这对于一条语句中的一堆内联追加来说是正确的。如果在使用多个语句的过程中构建字符串,则是在浪费内存,StringBuffer或StringBuilder是更好的选择。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档