ホームページ  >  記事  >  Java  >  Java 文字列プールは「new String(\"literal\")」をどのように処理しますか?

Java 文字列プールは「new String(\"literal\")」をどのように処理しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 12:11:29841ブラウズ

How Does the Java String Pool Handle `new String(

文字列定数プール: 誤解を明らかにする

Java では、「abc」のような「文字列リテラル」がインターンされます。これは、同じリテラル値への複数の参照が同じものを指すことを意味します。メモリ内のインスタンス。これは、メモリの使用量とパフォーマンスを最適化するのに役立ちます。ただし、 new String("abc") などの String リテラルで new を使用すると、リテラルが String プールにすでに存在する場合でも、新しい String オブジェクトが作成されます。

String プールに関する 2 つのステートメントが発生しました。いくつかの混乱:

  • ステートメント 1: 「コンパイラーは String リテラルに遭遇すると、プールをチェックして同一の String がすでに存在するかどうかを確認します。」
  • ステートメント 2: 「文字列リテラルで new を使用する場合、リテラルへの参照は引き続き定数テーブル (文字列リテラル プール) に置かれますが、JVM は実行時に新しい String オブジェクトを作成します。 "

明確にするために、ステートメント 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 サイトの他の関連記事を参照してください。

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