Java 什么';这是一个使用StringBuffer的真实示例?

Java 什么';这是一个使用StringBuffer的真实示例?,java,string,Java,String,我正在使用Java6 我只编写了几个多线程应用程序,因此我从未遇到过有多个线程访问同一个StringBuffer的情况 有人能给我一个真实世界的例子,当StringBuffer可能是有用的吗 谢谢 编辑:对不起,我想我不够清楚。我总是使用StringBuilder,因为在我的应用程序中,一次只有一个线程访问该字符串。所以我想知道什么样的场景需要多个线程同时访问StringBuffer。一般来说,这些类型的缓冲字符串对象在动态构建字符串时非常有用。它们试图最大限度地减少当您不断将固定大小的字符串附

我正在使用Java6

我只编写了几个多线程应用程序,因此我从未遇到过有多个线程访问同一个StringBuffer的情况

有人能给我一个真实世界的例子,当StringBuffer可能是有用的吗

谢谢


编辑:对不起,我想我不够清楚。我总是使用StringBuilder,因为在我的应用程序中,一次只有一个线程访问该字符串。所以我想知道什么样的场景需要多个线程同时访问StringBuffer。

一般来说,这些类型的缓冲字符串对象在动态构建字符串时非常有用。它们试图最大限度地减少当您不断将固定大小的字符串附加在一起时所产生的内存分配和释放量


因此,在一个真实的例子中,假设您正在为一个页面手动构建HTML,在这里您可以添加大约100个字符串。如果使用不可变字符串执行此操作,JAVA虚拟机将执行相当多的内存分配和释放,而使用StringBuffer执行的操作要少得多。

StringBuffer是程序员非常流行的选择

它与标准字符串对象相比具有优势,因为它不是一个不变的对象。因此,如果将值附加到StringBuffer,则不会创建新对象(与使用String时一样),而只是将其附加到末尾

这使StringBuffers(在某些编译器无法补偿的情况下)具有性能优势

我倾向于在向字符串输出动态添加数据的任何位置使用StringBuffers,例如日志文件编写器或其他文件生成

另一种选择是StringBuilder。然而,这并不是线程安全的,因为它并不是为了在单线程应用程序中提供更好的性能而设计的。除了在StringBuffer中包含sychronized关键字的方法签名外,这些类几乎是相同的


但是,在单线程应用程序中,建议使用StringBuilder而不是StringBuffer,这是由于性能提高(或者如果您从另一个角度看,是由于StringBuffer的性能开销).

一个简单的例子是,当您有一个日志文件,多个线程记录错误或警告并写入该日志文件时。

我能想到的唯一现实例子是,如果您的目标是1.5之前的Java版本。该类是在1.5中引入的,因此对于旧版本,您必须使用它

在大多数其他情况下,出于性能原因,应首选
StringBuilder
而不是
StringBuffer
——很少需要
StringBuffer
提供额外的线程安全性。我想不出任何明显的情况下,
StringBuffer
会更有意义。也许有一些,但我现在想不出一个

事实上,似乎连Java库作者都承认
StringBuffer
是一个:

图书馆小组的评价:

根据设计,StringBuffer和StringBuilder不共享 公共公共超类型。它们不打算作为替代品: 一个是错误(StringBuffer),另一个是错误(StringBuilder) 是它的替代品

如果先将
StringBuilder
添加到库中,则可能永远不会添加
StringBuffer
。如果多个线程附加到同一个字符串似乎是一个好主意,那么可以通过同步对
StringBuilder
的访问来轻松实现线程安全。不需要一整节额外的课和它引起的所有混乱


还值得注意的是,深受Java库启发的.NET基类库有一个类,但没有
StringBuffer
,我从未见过有人对此抱怨。

(这是最近从一个链接到的线程中引用的。)我也将此作为一个示例,但是在很少的情况下,直接使用Java库中的“基本类型”或类似类型来表示代码中的逻辑函数对我来说是个好主意。总有一天,当您需要向其添加功能或需要(通过编译器/IDE)区分逻辑功能和用于其他功能的同一类型时,时间总是早一点而不是晚一点。auto inc DB index的专用类太多了,但也不是例外。我认为应该是“StringBuffer是程序员非常流行的选择”,直到StringBuilder被引入:)