2010-12-12 27 views
2

私はJava 6を使用しています。StringBufferを使用する実際の例は何ですか?

私は複数のマルチスレッドアプリケーションしか書いていないので、同じStringBufferに複数のスレッドがアクセスしたときは一度も出会ったことがありません。

誰かがStringBufferが役に立つかもしれない現実世界の例を教えてもらえますか?

ありがとうございました。

編集:申し訳ありませんが、私は十分に明確ではなかったと思います。私のアプリケーションでは、一度に1つのスレッドだけが文字列にアクセスするため、私は常にStringBuilderを使用します。そこで、どのようなシナリオで同時に複数のスレッドでStringBufferにアクセスする必要があるのだろうかと思っていました。

答えて

8

私が考えることができる唯一の現実世界の例は、Javaバージョンbefere 1.5をターゲットにしている場合です。 StringBuilderクラスが1.5で導入されました。古いバージョンの場合はStringBufferを代わりに使用する必要があります。

ほとんどの場合、StringBuilderは、パフォーマンス上の理由からStringBufferに指定する必要があります。StringBufferによって提供される余分なスレッドの安全性はほとんどありません。私はStringBufferがもっと理にかなっている明らかな状況は考えられません。多分、いくつかあるかもしれませんが、今私は考えることができません。

それはStringBufferをとのStringBuilderが何 共通の公開を共有しないような設計である:図書館チームによって

評価:

実際にはそれもJavaライブラリの作者がStringBuffermistakeだったことを認めているようですスーパータイプ。代わりのものではありません。 1つは誤り(StringBuffer)、もう1つ(StringBuilder) はその置き換えです。

StringBuilderがライブラリに最初に追加された場合、StringBufferはおそらく決して追加されませんでした。同じ文字列に複数のスレッドが追加されているような状況にある場合は、StringBuilderへのアクセスを同期させることでスレッドの安全性を簡単に得ることができます。余分なクラス全体とそれが引き起こすすべての混乱の必要はありません。

また、Javaのライブラリに大きく影響された.NET基本クラスライブラリはStringBuilderクラスを持っていますが、StringBufferはありません。

0

一般に、これらのタイプのバッファリングされた文字列オブジェクトは、文字列を動的に構築する場合に便利です。固定サイズの文字列を継続して追加するときに作成されるメモリの割り当てと解放を最小限に抑えようとします。

実際の例では、約100個の文字列を追加するページのHTMLを手動で作成しているとします。これを不変の文字列で行うと、JAVA仮想マシンはかなりのメモリ割り当てと解放を行いますが、StringBufferを使用すると、はるかに少なくなります。

0

StringBufferは、プログラマにとって非常に一般的な選択です。

標準のStringオブジェクトよりも、不変なオブジェクトではないという利点があります。したがって、StringBufferに値が追加された場合、新しいオブジェクトは作成されず(Stringの場合のように)、最後に追加されるだけです。

これはStringBuffers(コンパイラによって補償できない特定の状況下で)パフォーマンス上の利点をもたらします。

私は、ログファイルライターやその他のファイル生成など、文字列出力にデータを動的に追加する場所であれば、どこでもStringBuffersを使用する傾向があります。

もう1つの方法はStringBuilderです。しかし、これはスレッドセーフではありません。シングルスレッドアプリケーションでさらに優れたパフォーマンスを提供しないように設計されているからです。 StringBufferにsychronizedキーワードを含むメソッドシグネチャは別として、クラスはほぼ同じです。

しかし、シングルスレッドアプリケーションではStringBuilderよりもStringBuilderを使用することをお勧めします。これは、パフォーマンスが向上するためです(または、StringBufferのパフォーマンスオーバーヘッドのために別の方法で見た場合)。

+0

StringBuilderが導入されるまで、「StringBufferは非常に人気のある選択肢でした」と思っています。 –

2

ログファイルがあり、複数のスレッドがエラーまたは警告を記録していて、そのログファイルに書き込んでいるときは、単純なケースがあります。

+0

(これは最近、リンクされたスレッドから照会されました) 私はこれを例として使用するつもりでしたまた、Javaライブラリから直接「基本型」などを使用してコード内の論理関数を表現することは、私にとっては良い考えです。機能を追加する必要がある場合や、論理機能と他の用途に使用されているものとの間で(コンパイラ/ IDEによって)区別する必要がある場合は、遅かれ早かれ早く時間があります。 auto-inc DBインデックスの専用クラスは、あまりにも多くの作業ですが、実際には例外ではありません。 –

関連する問題