在“有效的Java”一书中,Josh Bloch说
StringBuffer在很大程度上已经过时,应该被替换 非同步实现'StringBuilder'
。
但根据我的经验,我仍然看到StringBuffer类的广泛使用。为什么StringBuffer类现在已经过时,为什么StringBuilder优先于StringBuffer,除非由于非同步而提高了性能?
答案 0 :(得分:68)
Java 1.5 上的新代码通常应该使用StringBuilder
- 它的非常很少,你真的需要在线程安全中构建字符串已经过时了方式,为什么要支付同步费用?
我怀疑您使用StringBuffer
看到的代码大多属于以下代码:
StringBuilder
StringBuilder
答案 1 :(得分:19)
并非每个人都像你一样广泛阅读: - )
我只是半开玩笑。人们一直在复制代码和模式。很多人都没有与API变化保持联系。
为什么StringBuffer已过时?因为在绝大多数情况下,不需要其同步行为。我想不出我曾经需要它的时间。尽管同步现在不是以前的性能问题,但在没有必要的情况下支付税款是没有意义的。
答案 2 :(得分:9)
为什么StringBuffer类现在已经过时了?
因为它的操作是同步的,这增加了开销并且很少有用。
你仍然看到StringBuffer
被广泛使用的原因只是惯性:仍有无数的代码示例教程从未更新过使用StringBuilder
,人们仍然学习过时的做法(不仅仅是这一个来自这些来源。甚至那些了解得更好的人也会回归旧习惯。
答案 3 :(得分:5)
我认为过时是夸大其词。
StringBuffer已同步。 StringBuilder不是。
在许多(可能是大多数)情况下,您不会关心用于构建字符串的线程的线程安全性。在这些情况下,您应该使用StringBuilder。但是,在某些情况下,您可能希望确保对象上的操作是线程安全的。 StringBuffer在这些情况下仍然有用。
答案 4 :(得分:4)
在大多数情况下,不仅不需要同步,如果您仍然使用它,它实际上会为读者提供错误的信息:即,读者可能会认为需要同步,而实际上并非如此。
使用StringBuilder
来宣传您不希望跨线程访问的事实。
事实上,跨线程发送数据几乎总是应该通过明确定义的通信通道完成,而不仅仅是通过访问同步字符串缓冲区。所以在某种程度上,我建议总是使用不同的解决方案,即使StringBuffer
乍一看似乎合适。