Java の String、StringBuffer、StringBuilder は、プログラミングでよく使用される文字列クラスです。これらの違いは、面接でもよく聞かれる質問です。次に、それらの違いと類似点を要約して見てみましょう。
1. Mutable と Immutable
以下に示すように、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, ); //存在 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 の違いのまとめ
* String クラスは、String が変更される限り、新しいオブジェクトが生成されます。
* StringBuffer と StringBuilder は両方とも可変クラスであり、文字列を変更しても新しいオブジェクトは作成されません。
実際の使用では、挿入や削除など、文字列を変更する必要が頻繁にある場合に
* しかし、StringBufferとStringBuilderの違いは何でしょうか?
StringBuffer はスレッドセーフであり、マルチスレッドプログラムで使用すると非常に便利ですが、プログラムの効率は遅くなります。
StringBuilder はスレッドセーフではなく、単一スレッドでは StringBuffer よりも効率的です。
* 3 つの実行時間をまとめると、
String > StringBuffer > StringBuilder