概要:
文字列定数プールは、文字列リテラルを含む定数値を格納する Java 仮想マシン (JVM)。 JVM はコンパイル中に文字列リテラルを検出すると、同じ値を持つ既存のプールがないかどうかをチェックします。新しいリテラルが見つかった場合、新しいリテラルへの参照は既存の文字列に送られ、新しいインスタンスの作成が回避されます。
「new」キーワードによるインターン:
ただし提供されている参考資料で説明されているように、新しい String オブジェクトを作成するときに "new" キーワードを使用すると、異なる動作が導入されます。 String リテラル (この場合は「test」) への参照は引き続きプールに配置されますが、JVM はプールのオブジェクトを再利用するのではなく、実行時に新しい String オブジェクトを作成する義務があります。
質問:
プール内の文字列リテラルへの参照が「new」で作成されたときと同じである場合、JVM は新しい参照を作成する代わりに既存の参照を返すべきではないでしょうか。 ?
答え:
いいえ、「new」演算子が使用されている場合、JVM は既存の参照を返しません。代わりに、新しい String オブジェクトを作成し、それを「new」キーワードによって作成された参照に割り当てます。これは、次の理由によるものです。
例:
<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 サイトの他の関連記事を参照してください。