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,而 StringBuffer
的 append()
在相同的字符串上工作,这就是为什么它被认为更快的原因。但是,您应该使用 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方法连接字符串性能更好?