51

「EffectiveJava」という本の中で、JoshBlochは次のように述べています。

StringBufferはほとんど廃止されており、同期されていない実装「StringBuilder」に置き換える必要があります

しかし、私の経験では、StringBufferクラスが広く使用されているのを見てきました。StringBufferクラスが廃止されたのはなぜですか。また、非同期によるパフォーマンスの向上を除いて、StringBuilderをStringBufferよりも優先する必要があるのはなぜですか。

4

5 に答える 5

71

Java 1.5の新しいコードが一般的に使用する必要があるという点で廃止されました。スレッドセーフな方法で文字列を作成する必要があるStringBuilderことは非常にまれですが、なぜ同期コストを支払うのでしょうか。

私はあなたが使用しているのを見るコードはStringBuffer主に次のバケツに分類されると思います:

  • Java1.5より前に作成
  • 古いJDKとの互換性を維持するために作成されました
  • 知らない人が書いたStringBuilder
  • 知らないツールによって自動生成StringBuilder
于 2011-07-21T11:08:17.503 に答える
19

誰もがあなたほど広く読んでいるわけではありません:-)

私は冗談半分です。人々は常にコードとパターンをコピーします。多くの人はAPIの変更について連絡を取り合っていません。

StringBufferが廃止されたのはなぜですか?ほとんどの場合、同期された動作は必要ないためです。今まで必要だった時期が思い浮かびません。同期は以前のパフォーマンスの問題ではなくなったという事実にもかかわらず、不要なシナリオでその税金を支払うことはほとんど意味がありません。

于 2011-07-21T11:05:51.110 に答える
9

StringBufferクラスが廃止されたのはなぜですか?

その操作は同期されているため、オーバーヘッドが追加され、ほとんど役に立ちません。

あなたがまだ広く使われているのを見る理由StringBufferは単に慣性です:使用するために更新されなかったチュートリアルがまだ無数StringBuilderにあり、人々はまだそのようなソースから(これだけでなく)時代遅れの慣習を学びます。そして、よく知っている人でさえ、しばしば古い習慣に戻ってしまいます。

于 2011-07-21T11:10:43.560 に答える
5

時代遅れは誇張だと思います。

StringBufferは同期されます。StringBuilderはそうではありません。

多くの場合(おそらくほとんどの場合)、文字列の作成に使用されるもののスレッドセーフは気になりません。このような場合は、StringBuilderを使用する必要があります。ただし、場合によっては、オブジェクトに対するアクションがスレッドセーフであることを確認したい場合があります。StringBufferは、そのような場合でも役立ちます。

于 2011-07-21T17:06:22.593 に答える
4

ほとんどの場合、同期は必要ないだけでなく、それでも使用すると、実際にはコードの読者に間違った情報を提供します。つまり、実際には同期が必要でない場合に同期が必要であると読者に信じ込ませることができます。

代わりに使用するStringBuilderと、クロススレッドアクセスを期待しないという事実がアドバタイズされます。

実際、スレッド間でのデータの送信は、同期された文字列バッファーにアクセスするだけでなく、ほとんどの場合、明確に定義された通信チャネルを介して実行する必要があります。したがって、ある意味では、一見適切と思われる場合でも、常に別のソリューションを使用することをお勧めします。StringBuffer

于 2011-07-21T14:13:48.193 に答える