これらのStackoverflowの質問で説明されているように:質問1と質問2 「文字列リテラル」は次の場合にインターンされることを理解しています。
String s = "abc";
また、JVMは、次の場合に、文字列プールの既存のオブジェクトを使用する代わりに、新しい文字列オブジェクトを作成します。
String s = new String("abc");
しかし、次の2つの類似したステートメントを読んだ後、私は疑問を持っています。
- SCJP準備本から:
コンパイラが文字列リテラルを検出すると、プールをチェックして、同一の文字列がすでに存在するかどうかを確認します。一致するものが見つかった場合、新しいリテラルへの参照は既存の文字列に向けられ、新しい文字列リテラルオブジェクトは作成されません。
- JavaRanchから:
この場合、キーワード「new」のため、実際にはわずかに異なる動作になります。このような場合でも、文字列リテラルへの参照は定数テーブル(文字列リテラルプール)に配置されますが、キーワード「new」に到達すると、JVMは実行時に新しい文字列オブジェクトを作成する必要があります。定数テーブルからのものを使用するのではなく。
したがって、上記の定義に基づいて「new」を使用してオブジェクトを作成するときに、非プールメモリとプールメモリにも参照を配置するとします。これを行うときに、JVMも同じ参照を返す必要がありますか?:
String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false
文字列リテラルを宣言するとき、String three = "test";
それはすでにプールに存在するのでしょうか?したがって、同じ参照を返し、trueを出力する必要がありますか?new
または、前のステートメントは、それらがプールメモリに配置されるが、演算子が使用されるときに単にスキップされることを意味しますか?