Java 文字列プールの重複に関する混乱
次のコード スニペットを考えてみましょう。
String first = "abc"; String second = new String("abc");
新しいキーワードを使用すると、新しい文字列オブジェクト。ただし、この新しいオブジェクトは通常のヒープに存在するのか、それとも String プールに存在するのかという疑問が生じます。そして、プールにはいくつの String オブジェクトが入るのでしょうか?
String プールのメカニズム
String プールはキャッシュとして機能し、メモリ使用量を最適化します。 「abc」のようなリテラル String を宣言すると、コンパイラーはそれを認識し、プールから既存の String オブジェクトが存在する場合はそれをフェッチします。次の例の s と p はどちらも同じ String オブジェクトを参照します。
String s = "abc"; String p = "abc";
new String() の効果
ただし、次の使用法を使用して新しい String オブジェクトを作成します。 new String("abc") は、プールに格納されない別のオブジェクトを作成します。プールにはリテラル "abc" への参照が保存されますが、new で生成されたコピーは保存されません。
Java では String は不変であるため、不要なオーバーヘッドが発生するため new String("literal") を使用するのは無意味です。
インターンストリング
呼び出しString オブジェクトの intern() メソッドは、それがまだ存在しない場合はプールに追加します。このメソッドは、既にプール内にあるかどうかに関係なく、プールされた String への参照を返します。
結論
本質的に、new キーワードを使用すると、別の String が作成されます。同じリテラル文字列がプール内にすでに存在している場合でも、オブジェクトはプールの外にあります。文字列プールにはリテラル文字列への参照のみが保存され、メモリ割り当てが最適化されます。不必要なオブジェクトの作成を回避し、効率的なメモリ管理を促進するには、この動作を認識することが重要です。
以上が`new String('abc')` は Java の文字列プールに新しい文字列オブジェクトを作成しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。