JavaのString、StringBuffer、StringBuilderはプログラミングでよく使われる文字列クラスで、これらの違いは面接でもよく聞かれる質問です。次に、それらの違いと類似点を要約して見てみましょう。
1. 可変と不変
以下に示すように、String クラスは文字配列を使用して文字列を保存します。これにより、文字列オブジェクトが不変であることがわかります。
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 サイトをサポートしていただければ幸いです。
Java の String、StringBuffer、StringBuilder の違いをさらに詳しく分析するには、PHP 中国語 Web サイトに注目してください。