16

重複の可能性:
String、StringBuffer、および StringBuilder

/が可変Stringである場合、 は不変であることがわかっています。しかし、コードで何を使用するか混乱することがあります.. StringまたはStringBuffer/StringBuilder ?? 実際には、最大コード/クイック コードでは、 /よりも優先して使用します。StringBufferStringBuilderStringStringBufferStringBuilder

この質問は混乱を解決するためのものです。何か考えと適切な理由がある場合は、返信してください。

4

3 に答える 3

34

以下は、最も一般的に使用されるこれら 3 つのクラスの主な違いです。

  • String クラス オブジェクトは不変ですが、StringBuffer および StringBuilder オブジェクトは変更可能です。
  • StringBuffer は同期されますが、StringBuilder は同期されません。
  • 連結演算子「+」は、StringBuffer または StringBuilder を使用して内部的に実装されます。

StringStringBuffer、およびStringBuilderから選択する基準

  • String オブジェクトは不変であるため、Object 値が変更されない場合は String クラスを使用します。
  • Object 値が変更される可能性があり、単一のスレッドからのみアクセスされる場合は、StringBuilder を使用します。これは、StringBuilder が同期されていないためです。
  • Object 値が変更される可能性があり、複数のスレッドによって変更される場合は、StringBuffer が同期されるため、StringBuffer を使用します。
于 2012-06-30T11:48:28.853 に答える
4

主なアイデアは、String が不変であるということです。したがって、変更しようとすると、新しいオブジェクトが作成されます。StringBuffer と StringBuilder は可変です。そして違いは、最初のものはスレッドセーフです。

StringBuilder を使用する一般的な方法は、非スレッド セーフ環境で String オブジェクトを繰り返し作成するときに何かを解析することです。

たとえば、数値配列 [1, 2, 3] があるとします。オブジェクト「String1String2String3」を作成するには、StringBuilder を使用できます

StringBuilder builder = new StringBuilder();
foreach(Integer num : array) {
    builder.append("String").append(num);
}
builder.toString();

を使用するよりも優れていString string = string + ("String" + num);ます。私の知る限り、コンパイラは StringBuilder へのループで文字列連結を使用して最適化しますが、手動で使用することをお勧めします。

StringBuffer は、同時スレッドによって変更される共有状態がある場合に使用されます。

于 2012-06-30T11:58:11.180 に答える
2

つまり、一度に 1 つのスレッドだけが StringBuffer オブジェクトの同期されたコードにアクセスできるように、アクセスを制御するための同期されたメソッドがあります。したがって、StringBuffer オブジェクトは通常、マルチスレッド環境で安全に使用できます。

StringBuilder のアクセスは同期されないため、スレッドセーフではありません。同期しないことで、StringBuilder のパフォーマンスは StringBuffer よりも向上する可能性があります。したがって、シングルスレッド環境で作業している場合、StringBuffer の代わりに StringBuilder を使用すると、パフォーマンスが向上する可能性があります。

于 2012-06-30T11:51:14.053 に答える