ホームページ >Java >&#&チュートリアル >同じ値を持つ文字列が文字列定数プールにすでに存在する場合でも、「new String()」で新しいオブジェクトが作成されるのはなぜですか?
文字列定数プール: インターンと「新しい」演算子について理解する
Java では、「abc」などの文字列リテラルがインターンされますつまり、それらは String 定数プールに保存され、それらへの参照は共有されます。ただし、「new」演算子を使用して新しい String オブジェクトが作成されると、プール内の既存のオブジェクトを参照するのではなく、メモリ内に新しいオブジェクトが作成されます。
この動作に関する矛盾した記述により、誤解が生じています。 JVM はリテラルを検出したときにプール内の既存の文字列をチェックしますが、このチェックは実際にインターンされる文字列にのみ適用されます。リテラルが非プール メモリで参照される場合 (「new」を使用)、一致する文字列がプールにすでに存在する場合でも、新しいオブジェクトが作成されます。
これを説明するために、次のコードを考えてみましょう。
<code class="java">String one = new String("test"); String two = "test";</code>
"test" はインターンされるリテラルであるため、それへの参照はすでにプール内にあります。ただし、"new" を使用して 1 つが作成されると、新しい String オブジェクトがメモリに割り当てられます。これは、2 つとは異なる参照を持つことを意味します。
<code class="java">System.out.println(one.equals(two)); // true System.out.println(one == two); // false</code>
equals() メソッドは文字列の値を比較します。
「new」を使用して作成された文字列が依然としてプールに配置されることを暗示するステートメントから混乱が生じる可能性がありますが、これは誤解を招きます。リテラルと同じ値を持つ文字列がメモリ内のどこかに存在する可能性がありますが、その文字列はプールには追加されず、リテラル自体を介してアクセスすることもできません。
したがって、「new」演算子を使用する場合、JVM同じ値の String オブジェクトが存在する場合でも、プールから既存の String オブジェクトへの参照を返すのではなく、メモリ内に新しい String オブジェクトを作成します。
以上が同じ値を持つ文字列が文字列定数プールにすでに存在する場合でも、「new String()」で新しいオブジェクトが作成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。