ホームページ > Java > &#&チュートリアル > 同じリテラルへの参照が定数プールに存在する場合でも、Java が新しい文字列オブジェクトを作成するのはなぜですか?

同じリテラルへの参照が定数プールに存在する場合でも、Java が新しい文字列オブジェクトを作成するのはなぜですか?

DDD
リリース: 2024-11-03 07:26:02
オリジナル
576 人が閲覧しました

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java 文字列定数プール: インターンと参照の等価性

概要:

文字列定数プールは、文字列リテラルを含む定数値を格納する Java 仮想マシン (JVM)。 JVM はコンパイル中に文字列リテラルを検出すると、同じ値を持つ既存のプールがないかどうかをチェックします。新しいリテラルが見つかった場合、新しいリテラルへの参照は既存の文字列に送られ、新しいインスタンスの作成が回避されます。

「new」キーワードによるインターン:

ただし提供されている参考資料で説明されているように、新しい String オブジェクトを作成するときに "new" キーワードを使用すると、異なる動作が導入されます。 String リテラル (この場合は「test」) への参照は引き続きプールに配置されますが、JVM はプールのオブジェクトを再利用するのではなく、実行時に新しい String オブジェクトを作成する義務があります。

質問:

プール内の文字列リテラルへの参照が「new」で作成されたときと同じである場合、JVM は新しい参照を作成する代わりに既存の参照を返すべきではないでしょうか。 ?

答え:

いいえ、「new」演算子が使用されている場合、JVM は既存の参照を返しません。代わりに、新しい String オブジェクトを作成し、それを「new」キーワードによって作成された参照に割り当てます。これは、次の理由によるものです。

  • リテラルインターニング: コンパイラーは、文字列リテラル「test」を検出すると、プール内に同一の文字列が存在するかどうかを確認します。存在しないため、値 "test" を持つ新しい String オブジェクトが作成され、プールに配置されます。
  • "new" によるオブジェクトの構築: 新しい String を作成するとき"new String(literal)" を使用してオブジェクトを作成すると、リテラル ("test") への参照がコンストラクターに渡されます。これは、コンストラクター内の参照がプール内のリテラルと同じ値を持つことを意味します。
  • 新しいオブジェクトの作成: ただし、「new」演算子は JVM に新しい文字列を作成するように指示します。物体。この新しいオブジェクトは、同じリテラル値を参照しているにもかかわらず、プールに格納されているオブジェクトとは別のインスタンスです。

例:

<code class="java">String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); // true (references in pool)
System.out.println(one == two); // false (distinct objects)</code>
ログイン後にコピー

この例では、「リテラル」と「2 つの」参照は、プール内の同じ String オブジェクトを指します。ただし、「one」参照は、「new」によって作成された別の String オブジェクトを指します。したがって、「==」を使用した等価比較は false を返します。

明確化:

ステートメント「コンパイラは String リテラルを検出すると、プールをチェックして確認します。 「同一の文字列がすでに存在する場合」は「プール内」と解釈される必要があります。つまり、インターンされたかプールに明示的に追加された文字列リテラルのみがインターンの対象となります。

以上が同じリテラルへの参照が定数プールに存在する場合でも、Java が新しい文字列オブジェクトを作成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート