JavaのString、StringBuffer、StringBuilderはプログラミングでよく使われる文字列クラスで、これらの違いは面接でもよく聞かれる質問です。次に、それらの違いと類似点を要約して見てみましょう。
1. 可変と不変
以下に示すように、String クラスは文字配列を使用して文字列を保存します。これは、「final」修飾子により、文字列オブジェクトが不変であることがわかります。
private Final char value[];
StringBuilder と StringBuffer はどちらも AbstractStringBuilder クラスを継承しており、以下に示すように、文字配列も文字列の保存に使用されます。
char[] value;
2. マルチスレッドセーフですか?
String 内のオブジェクトは不変であり、定数として理解できるため、明らかにスレッドセーフです。
AbstractStringBuilder は StringBuilder と StringBuffer の共通の親クラスで、expandCapacity、append、insert、indexOf、その他のパブリック メソッドなどの文字列のいくつかの基本的な操作を定義します。
StringBuffer はメソッドに同期ロックを追加するか、呼び出し元のメソッドに同期ロックを追加するため、スレッドセーフです。以下のソース コードを見てください:
public synchronized StringBuffer reverse() { super.reverse(); return this; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }
StringBuilder はメソッドに同期ロックを追加しないため、スレッドセーフではありません。
3. StringBuilder と StringBuffer の共通点
StringBuilder と StringBuffer には、AbstractStringBuilder (抽象クラス) という共通の親クラスがあります。
抽象クラスとインターフェイスの違いの 1 つは、抽象クラスはサブクラスの一部のパブリック メソッドを定義する必要があるのに対し、インターフェイスはメソッドと定数の定義を宣言するだけであるということです。
StringBuilder と StringBuffer のメソッドは、super.append(...) など、AbstractStringBuilder のパブリック メソッドを呼び出します。 StringBuffer が同期用のメソッドに synchronized キーワードを追加するだけです。
最後に、プログラムがマルチスレッドでない場合は、StringBuffer よりも StringBuilder を使用する方が効率的です。
Java の String、StringBuffer、StringBuilder の違いを紹介するその他の関連記事については、PHP 中国語 Web サイトに注目してください。