7

私の質問は、文字列を次のように宣言するときに、文字列プールとヒープで文字列オブジェクトを作成することString a = new String("abc");の利点は何ですか?

そして、文字列を として作成するときに、ヒープに文字列を作成しないのはなぜですかString a = "abc"

4

4 に答える 4

6

Java 言語はそのように設計されています。二重引用符の間に使用するものはすべてコンパイル時定数であり、文字列プールに入ります。だから、あなたの場合:

String a = new String("abc");

"abc"コンパイル時定数として解決されるため、現在の JVM の文字列定数プールに追加されます。

次に、 の値がa実行時に解決され、実行時にヒープに追加されます。

于 2014-11-21T06:14:24.807 に答える
3

まず、説明どおりに動作するため、使用しないことをお勧めします。new String("abc")第二に、使用すると、新しいインスタンスが作成されることnewを期待する必要があります。Object

于 2014-11-21T06:12:41.150 に答える
0

以下の 2 つの理由により、文字列定数プールにオブジェクトを作成しないでください。

  1. Intern() メソッドを使用して、文字列オブジェクトを文字列定数プールに追加します。文字列オブジェクトが文字列定数プールに存在する場合、intern() メソッドは使用されません。

  2. 文字列リテラル = "abc"; String object = new String("abc"); System.out.println("結果 = " + リテラル == オブジェクト); // 間違い

コンパイル時に文字列オブジェクトが文字列定数プールに存在する場合、結果は true になります。

間違っている場合は修正してください。

于 2015-09-24T14:36:01.283 に答える