StringBuffer已经过时了?

Var*_*har 50 java string stringbuilder stringbuffer

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

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

.

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

Jon*_*eet 68

它已经过时了,因为Java 1.5上的新代码通常应该使用StringBuilder- 你真的需要以线程安全的方式构建字符串是非常罕见的,那么为什么要支付同步成本呢?

我怀疑你看到的代码StringBuffer主要属于:

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

  • 我浏览了StringBuffer和StringBuilder的代码.它们完全相同,只是StringBuffer的所有方法都附加了synchronized关键字. (21认同)

Bri*_*new 19

不是每个人都像你一样广泛阅读:-)

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

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


Mic*_*rdt 9

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

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

您仍然看到StringBuffer广泛使用的原因仅仅是惯性:仍然有无数代码示例教程从未更新过使用StringBuilder,人们仍然从这些来源学习过时的实践(不仅仅是这一个).即使知道得更好的人也常常会回归过去的习惯.


Mat*_*ynn 5

我认为过时是一种夸大其词.

StringBuffer已同步.StringBuilder不是.

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

  • 如果你关心结果字符串中的数据顺序,我不确定我是否有理由让多个线程构建一个字符串. (3认同)
  • @Hardwareguy:我想是某种记录器,因为你可以通过附加一条完整的消息来工作.虽然会很混乱,并且代码气味很差. (2认同)