ホームページ >Java >&#&チュートリアル >`new String('abc')` は Java の文字列プールに新しい文字列オブジェクトを作成しますか?

`new String('abc')` は Java の文字列プールに新しい文字列オブジェクトを作成しますか?

DDD
DDDオリジナル
2024-12-25 21:48:16729ブラウズ

Does `new String(

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。