StringBuffer append() 还是 String +? [复制]

Posted

技术标签:

【中文标题】StringBuffer append() 还是 String +? [复制]【英文标题】:StringBuffer append() or String +? [duplicate] 【发布时间】:2012-02-18 06:23:00 【问题描述】:

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

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

【问题讨论】:

看看***.com/questions/47605/java-string-concatenation,随便搜一下java字符串拼接,这个话题已经讨论过很多次了。 这个问题已经被问过无数次了***.com/q/4648607/776084 【参考方案1】:

+ 创建新的中间体 String ojectss,因为字符串在 Java 中是 immutable,而 StringBufferappend() 在相同的字符串上工作,这就是为什么它被认为更快的原因。但是,您应该使用 java 5 中的 StringBuilder,因为据说它比 StringBuffer 快,因为它的方法不像 StringBuffer 那样 synchronized

这是高层次的理论解释。更多具体细节请查看String concatenation: concat() vs "+" operator 帖子。

【讨论】:

【参考方案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 个字符,垃圾收集的工作量很大。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于StringBuffer append() 还是 String +? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

Java中StringBuffer类append方法的使用

JAVA中Stringbuffer的append( )方法

Java中StringBuffer类append方法的使用

+ 运算符的性能是不是低于 StringBuffer.append()

stringbuffer的append方法返回类型是啥?