StringBuffer append()或String +?

时间:2012-01-25 00:36:46

标签: java performance

  

可能重复:
  java String concatenation
  StringBuilder vs String concatenation in toString() in Java

我读过一些关于append()的文章比+快得多,但是原因是什么,为什么我们会使用+ over append()呢?谢谢!

4 个答案:

答案 0 :(得分:6)

+创建新的中间String对象,因为Java中的字符串为immutable,而StringBuffer的{​​{1}}对同一字符串起作用,这就是为什么它被认为更快。但是,您应该在病房中使用java 5中的append(),因为据说它比StringBuilder更快,因为它的方法不像StringBuffer那样StringBuffer

这是高层次的理论解释。有关更具体的详细信息,请查看String concatenation: concat() vs "+" operator帖子。

答案 1 :(得分:2)

如果你的代码没有在循环中执行数千次,那么+是完全可以的。规则的例外,一个不断增长的字符串,一遍又一遍地重新分配内存:

// fine:
for (customer: list)
    System.out.println ("Customer: " + customer);

// prolematic for bigger lists:
for (word: list)
     chain += word;

有100个长度为50的单词,你的长度最终为50,100,150,... 5000 - 总共250 000个字符,垃圾收集工作量很大。

答案 2 :(得分:1)

只连接2个字符串(无循环)然后使用+通常更快。 如果你加入超过2个字符串,那么append()会更快。

不同之处在于字符串缓冲区在内部使用char []并在该数组中有额外的(空闲)空间来放入新的附加内容(如果数组太小,则数组会增长)。 +运算符实际上必须创建一个正确长度的新字符串,然后将左侧和右侧复制到其中。

答案 3 :(得分:1)

如果您正在为JDK 1.5或更高版本进行编译,则连接将变为StringBuilder,而不是StringBuffer。 StringBuilder针对局部变量的连接进行了优化(即,它是无锁的)。所以Greg Mattes上面提到的链接可能是你真正想问的问题。