StringBuffer已经过时了?

时间:2011-07-21 11:04:34

标签: java string stringbuilder stringbuffer

在“有效的Java”一书中,Josh Bloch说

  

StringBuffer在很大程度上已经过时,应该被替换   非同步实现'StringBuilder'

但根据我的经验,我仍然看到StringBuffer类的广泛使用。为什么StringBuffer类现在已经过时,为什么StringBuilder优先于StringBuffer,除非由于非同步而提高了性能?

5 个答案:

答案 0 :(得分:68)

Java 1.5 上的新代码通常应该使用StringBuilder - 它的非常很少,你真的需要在线程安全中构建字符串已经过时了方式,为什么要支付同步费用?

我怀疑您使用StringBuffer看到的代码大多属于以下代码:

  • 在Java 1.5之前编写
  • 编写以保持与旧JDK的兼容性
  • 由不了解StringBuilder
  • 的人撰写
  • 由不了解StringBuilder
  • 的工具自动生成

答案 1 :(得分:19)

并非每个人都像你一样广泛阅读: - )

我只是半开玩笑。人们一直在复制代码和模式。很多人都没有与API变化保持联系。

为什么StringBuffer已过时?因为在绝大多数情况下,不需要其同步行为。我想不出我曾经需要它的时间。尽管同步现在不是以前的性能问题,但在没有必要的情况下支付税款是没有意义的。

答案 2 :(得分:9)

  

为什么StringBuffer类现在已经过时了?

因为它的操作是同步的,这增加了开销并且很少有用。

你仍然看到StringBuffer被广泛使用的原因只是惯性:仍有无数的代码示例教程从未更新过使用StringBuilder,人们仍然学习过时的做法(不仅仅是这一个来自这些来源。甚至那些了解得更好的人也会回归旧习惯。

答案 3 :(得分:5)

我认为过时是夸大其词。

StringBuffer已同步。 StringBuilder不是。

在许多(可能是大多数)情况下,您不会关心用于构建字符串的线程的线程安全性。在这些情况下,您应该使用StringBuilder。但是,在某些情况下,您可能希望确保对象上的操作是线程安全的。 StringBuffer在这些情况下仍然有用。

答案 4 :(得分:4)

在大多数情况下,不仅不需要同步,如果您仍然使用它,它实际上会为读者提供错误的信息:即,读者可能会认为需要同步,而实际上并非如此。

使用StringBuilder来宣传您不希望跨线程访问的事实。

事实上,跨线程发送数据几乎总是应该通过明确定义的通信通道完成,而不仅仅是通过访问同步字符串缓冲区。所以在某种程度上,我建议总是使用不同的解决方案,即使StringBuffer乍一看似乎合适。