Java では、「abc」のような「文字列リテラル」がインターンされます。これは、同じリテラル値への複数の参照が同じものを指すことを意味します。メモリ内のインスタンス。これは、メモリの使用量とパフォーマンスを最適化するのに役立ちます。ただし、 new String("abc") などの String リテラルで new を使用すると、リテラルが String プールにすでに存在する場合でも、新しい String オブジェクトが作成されます。
String プールに関する 2 つのステートメントが発生しました。いくつかの混乱:
明確にするために、ステートメント 2 は、new でオブジェクトを作成する場合でも、文字列リテラルは引き続き String プールにインターンされますが、それに関係なく新しいオブジェクトが構築されることを意味します。
例:
String one = new String("test"); String two = "test";
new String("test") に渡される参照は、インターンにより 2 つと同じになります。ただし、値「test」を持つ新しい String オブジェクトが作成され、その 1 つに割り当てられます。
したがって、値「test」を持つ 2 つの別個の String オブジェクトが存在します。1 つは定数プール内にあります (2 によって参照されます)。そして new で作成された新しいもの (one で参照)。そのため、one.equals(two) は true (同じ値を持つ) ですが、one == two は false (異なるオブジェクトを参照します) になります。
ステートメント 1 は、次のように言い換える必要があります。文字列リテラルの場合、同一の文字列がプール内にすでに存在するかどうかを確認します。」文字列は、明示的にインターンされるか、クラス定義でリテラルとして使用される場合にのみインターンされます。
以上がJava 文字列プールは「new String(\"literal\")」をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。