我正在使用Java 6.
我只编写了几个多线程应用程序,所以我从来没有遇到过多个线程访问同一个StringBuffer的时候。
当StringBuffer可能有用时,有人会给我一个真实世界的例子吗?
感谢。
编辑:对不起我觉得我不够清楚。我总是使用StringBuilder,因为在我的应用程序中,一次只有一个线程访问字符串。所以我想知道什么样的场景需要多个线程同时访问StringBuffer。答案 0 :(得分:8)
我能想到的唯一现实世界的例子是,如果你的目标是Java版本的1.5。 StringBuilder
类是在1.5中引入的,因此对于旧版本,您必须使用StringBuffer
。
在大多数其他情况下,StringBuilder
出于性能原因应优先考虑StringBuffer
- 很少需要StringBuffer
提供的额外线程安全性。我无法想到StringBuffer
更有意义的任何明显情况。也许有一些,但我现在想不出一个。
事实上,即便是Java库作者也承认StringBuffer
是mistake:
图书馆团队的评估:
根据设计,StringBuffer和StringBuilder共享否 共同的公共超类型。它们不是替代品: 一个是错误(StringBuffer),另一个是(StringBuilder) 是它的替代品。
如果StringBuilder
已添加到库中,则可能永远不会添加StringBuffer
。如果您处于附加到同一字符串的多个线程似乎是个好主意的情况下,您可以通过同步对StringBuilder
的访问来轻松获得线程安全性。不需要一个额外的课程以及它造成的所有混乱。
值得注意的是,受Java库影响很大的.NET基类库有一个StringBuilder
类但没有StringBuffer
,我从未见过有人抱怨过这个问题。< / p>
答案 1 :(得分:2)
当您拥有一个日志文件并且多个线程正在记录错误或警告并写入该日志文件时,一个简单的案例就是。
答案 2 :(得分:0)
通常,在动态构建字符串时,这些类型的缓冲字符串对象非常有用。它们会尝试最小化在连续追加固定大小的字符串时创建的内存分配和释放量。
这是一个真实世界的例子,假设您正在手动为页面构建HTML,您可以在其中执行大约100个字符串追加。如果使用不可变字符串执行此操作,JAVA虚拟机将执行相当多的内存分配和释放,使用StringBuffer可以做很少的事情。
答案 3 :(得分:0)
StringBuffer是程序员非常喜欢的选择。
它具有优于标准String对象的优点,因为它不是不可变对象。因此,如果将值附加到StringBuffer,则不会创建新对象(就像使用String一样),而只是附加到末尾。
这使StringBuffers(在某些情况下无法由编译器补偿)具有性能优势。
我倾向于在我动态地将数据添加到字符串输出的任何地方使用StringBuffers,例如日志文件编写器或其他文件生成。
另一种选择是StringBuilder。但是,这不是线程安全的,因为它不是为了在单线程应用程序中提供更好的性能。除了在StringBuffer中包含sychronized关键字的方法签名之外,这些类几乎相同。
建议在单线程应用程序中使用StringBuilder而不是StringBuffer,因为性能提升(或者如果你反过来看,由于StringBuffer的性能开销)。