Java の String、StringBuffer、および StringBuilder (まとめ)

String クラスは、Java で文字列を操作するために一般的に使用されるクラスであり、Java プログラムのすべての文字列リテラルは、このクラスのインスタンスとして実装できます。
また、文字列を操作できるクラスとして、StringBuffer と StringBuilder の 2 つがありますが、上記の 3 つのクラスについて以下にまとめます。

文字列について

文字列は Java で規定されている 8 つの基本データ型とは異なり、これら以外の参照型に属します. 作成時には、まずその参照 (ハンドル) 用のメモリをスタック上に割り当て、特定の情報を取得する必要があります.ヒープ メモリ上では、スタック上の参照はヒープ内のオブジェクトのアドレスを指します。※参照型:型の実数値参照で表されるデータ型です(関数は単純にC言語のポインタに例えられますが、アドレスを保存するためにスタック上に小さなメモリ空間が開かれますが、メモリの概念
ポインタの

Sting str = "hello word";

ここに画像の説明を挿入

文字列を作成する方法

いくつかの一般的に使用される構築方法:

// 方式一
String str = "Hello wold";
// 方式二
String str2 = new String("Hello wold");

公式ドキュメントで提供されている String コンストラクターの部分インターセプト
ここに画像の説明を挿入

スティング弦の比較

参照型なので、この型で作成した2つの変数を==で比較すると、基本的なデータ型とは異なり、比較は2つの参照が同じオブジェクトを指しているかどうかであり、オブジェクト同士を比較したい値が等しい場合は、String クラスの下で equals メソッドを使用する必要があります

String str1 = new String("hello word")String str2 = new String("hello word");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true

ここに画像の説明を挿入

文字定数プールの理解

Java で String クラスを設計する場合、デザイン パターン -フライウェイト パターンが使用されます (つまり、オブジェクトの再利用のソリューションを提供し、共有テクノロジを使用して同じまたは類似のオブジェクトを再利用します)。JVM 仮想マシンでは
、最下層は、文字列を格納するために使用される領域、つまり、文字列定数プール
を維持します. 直接割り当ての方法を使用して文字列文字列を作成する場合、インスタンス化されたオブジェクトは自動的に文字列定数プールに保存され、によって作成されます
.次回も同じ方法. 文字列定数プールでこの値を使用するオブジェクトは、オブジェクトを直接参照し、とにかくそれを作成します.
ここに画像の説明を挿入

ps: コンストラクターを使用して文字列 (new String("abc")) を作成すると、ヒープ上に 2 つのメモリ空間が開かれ、文字列定数プールに自動的に保存されません。

String クラスのインスタンス化された 2 つのオブジェクトの違い:

直接代入による作成 (String str = "abc"): メモリ空間を開くだけで、コンストラクターを使用して作成する次の作成のために、文字列オブジェクトが文字列定数プールに自動的に保存されます (String str = new String(
" abc ”)): 2 つのメモリ空間が開かれます。新しいオブジェクトはヒープの共通領域にあります。作成された文字列は定数プールにあり、文字列定数プールに自動的に保存されません。入力した場合プールでは、String の intern( ) メソッドを呼び出す必要があります

String 文字列が不変なのはなぜですか?

1. 文字列定数プールを実現すると便利. イミュータブルならディープコピーとシャローコピーの問題を考える必要がない. 2.
オブジェクトがイミュータブルなのでスレッドセーフの問題を考える必要がない
. 3 HashMap にキーとして効率的に保存できる hashCode をキャッシュするには、Immutable の方が便利です。

String クラスの一般的に使用される API
ここに画像の説明を挿入

StringBuffer と StringBuilder

String で宣言された文字列自体は不変であるため、その内容を変更したい場合はその参照ポイントを変更することしかできないため、String 文字列の変更の便宜上、Java は StringBuffer と StringBuilder の 2 つのクラスを提供して操作します。

StringBuffer と StringBuilder のほとんどの機能は同じであり、いくつかの一般的な API を以下に紹介します。

コンストラクタ:
ここに画像の説明を挿入
修飾子:
ここに画像の説明を挿入
String から StringBuffer/StringBuilder へは、StringBuffer および StringBuilder の構築メソッドを使用する必要があります
StringBuffer および StringBuilder から String へは直接 toString() メソッドを使用します

String、StringBuffer、StringBuilder の違い

  1. String の内容は変更できませんが、StringBuffer と StringBuilder の内容は変更できます
  2. StringBuffer は同期ロックによるスレッド セーフを実装しますが、StringBuilder はスレッド セーフを実装しません
  3. StringBuffer の toString() メソッドはバッファを追加し、StringBuilder は文字配列を直接コピーして文字列を構築します
  4. StringBuilder はスレッド セーフを実装していないため、そのメソッドは同期ロックを追加しないため、StringBuilder の実行効率は StringBuffer よりもはるかに高くなります。

上記はStringの知識ポイントのまとめです. フォローアップ研究の深化に伴い, コンテンツは同期的に補足および変更されます. すべてのブロガーを助けることは非常に光栄です. 修正してください.

おすすめ

転載: blog.csdn.net/m0_46233999/article/details/109623723