私の質問は、文字列を次のように宣言するときに、文字列プールとヒープで文字列オブジェクトを作成することString a = new String("abc");
の利点は何ですか?
そして、文字列を として作成するときに、ヒープに文字列を作成しないのはなぜですかString a = "abc"
。
私の質問は、文字列を次のように宣言するときに、文字列プールとヒープで文字列オブジェクトを作成することString a = new String("abc");
の利点は何ですか?
そして、文字列を として作成するときに、ヒープに文字列を作成しないのはなぜですかString a = "abc"
。
Java 言語はそのように設計されています。二重引用符の間に使用するものはすべてコンパイル時定数であり、文字列プールに入ります。だから、あなたの場合:
String a = new String("abc");
"abc"
コンパイル時定数として解決されるため、現在の JVM の文字列定数プールに追加されます。
次に、 の値がa
実行時に解決され、実行時にヒープに追加されます。
まず、説明どおりに動作するため、使用しないことをお勧めします。new String("abc")
第二に、使用すると、新しいインスタンスが作成されることnew
を期待する必要があります。Object
以下の 2 つの理由により、文字列定数プールにオブジェクトを作成しないでください。
Intern() メソッドを使用して、文字列オブジェクトを文字列定数プールに追加します。文字列オブジェクトが文字列定数プールに存在する場合、intern() メソッドは使用されません。
文字列リテラル = "abc"; String object = new String("abc"); System.out.println("結果 = " + リテラル == オブジェクト); // 間違い
コンパイル時に文字列オブジェクトが文字列定数プールに存在する場合、結果は true になります。
間違っている場合は修正してください。