web-dev-qa-db-ja.com

StringBuilderまたはStringBufferはいつ使用する必要がありますか?

プロダクションWebアプリケーションでは、私の仲間のプログラマーはどこでもStringBufferを使用していました。現在、アプリケーションの開発と修正を担当しています。 StringBuilder および StringBuffer を読んだ後、データBeanでスレッドセーフティを必要としないため、すべてのStringBufferコードをStringBuilderに置き換えることにしました。

例:(各データBeanでStringBufferの使用を確認できます)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

セッション/リクエストごとに個別のデータBeanを作成します。セッションは、他のユーザーがアクセスできない単一のユーザーによって使用されます。

移行する前に他のポイントを検討する必要がありますか?

単一のスレッドがある場合(待機中のスレッドがないか、新しいスレッドがオブジェクトロックを検索しません)、StringBufferまたはStringBuilderと同じように実行されます。 StringBufferの場合、オブジェクトロックを取得するのに時間がかかることはわかっていますが、オブジェクトロックの保持/解放を除いて、それらの間にパフォーマンスの違いがあるかどうかを知りたいです。

13
Satish Pandey

2つの唯一の違いは、StringBufferで使用される同期です。同期のオーバーヘッドは、大まかな体系ではそれほど大きくありませんが、同期のオーバーヘッドがないStringBuilderメソッドに比べると、かなり重要です。 JVMは、特にスレッドが1つだけの場合など、他の方法では必要のない作業を行っています。

あなたのコードが機能し、人々がパフォーマンスについて不満を言っていないのであれば、私はそれについて心配しません。あなたはあなたのお金のために多くの強打を得るつもりはありません。ただし、新しいコードを記述している場合、またはStringBufferを使用するコードを更新している場合は、それらを同時にStringBuilderに変換することをお勧めします。

22
Matthew Flynn

StringBuilderは、より優れた高速のStringBufferになるように(Java 1.5)の時点で追加され、コンパイラは内部でそれを使用して、文字列に+演算子を実装します。

つまり、StringBuilderを使用しても、クラスが導入されたときよりも古いコードをJVMで実行することはできません。これはしばらくの間、私たちにとって問題になるでしょう。常に最新のものを実行している場合は、気にする必要はありません。

以下の理由により、私はあなたが経験した最適化プロセスを経験しません。

  • タイトなループの外側では、利点はごくわずかです。プロファイラーで明示的にホットスポットとして表示されない限り、私は気にしないでしょう。
  • コードを変更するとエラーが発生する可能性があるため、アプリケーションを完全に再テストする必要があります。これは、同期されていないクラスで同期されたクラスを使用するよりもはるかにコストがかかる可能性があります。
8
user1249