2

Java のように、

文字列が格納される場所は 2 つあります。その作成に応じた文字列リテラル プールとヒープ メモリ。文字列の割り当てが別の文字列に行われると、新しく作成された文字列はどこに保存されるのでしょうか?

ヒープと文字列プールにある両方のタイプの文字列に対して割り当て操作を実行しました。このような結果になりました。

    String str = new String("foo"); ===> str is created in heap memory
    String strL = "doo"; ===> strL is created in String pool.

でもいつ、

    String strNew = strL; // strL which is there in String Pool is assigned to strNew.

さて、こうしたら

    strL = null;
    System.out.println(strNew)// output : "doo".
    System.out.println(strL)// output : null.

同様に、

    String strNewH = str; // str which is there in heap is assigned to strNewH

今、

    str = null;
    System.out.println(strNewH);// output : "foo".
    System.out.println(str); // null

上記は、IDE で取得した出力です。この出力によると、strNew の新しい参照オブジェクトが文字列プールに作成され、strNewH の新しい参照オブジェクトがヒープに作成されます。それが正しいか?

4

1 に答える 1

2

あなたにはいくつかの誤解があります。

文字列プールもヒープの一部です。おそらく、文字列が文字列プールにあるか、ヒープの他の部分にあるかを尋ねるつもりでした。

また、割り当てが新しいオブジェクトを作成すると考えているようです。彼らはしません。変数とオブジェクトは別物です。これらの 2 行の後:

String str = new String("foo");
String strL = "doo";

変数は、文字列プールにない文字列オブジェクトstr を参照しています。"foo"変数strL "doo"、文字列プールにある文字列オブジェクトを参照します。

(「参照」という言葉に注意してください)

String変数を代入するときは、それらが参照するものを変更するだけです。ここ:

String strNew = strL;

strNew参照しているオブジェクトと同じオブジェクトを参照していますstrL

同様に、何かを null に設定すると、何も参照しなくなります。参照していたオブジェクトは、必ずしも破棄されているわけではありません。

あなたの質問に関しては:

この出力によると、新しい参照オブジェクトstrNewが文字列プールに作成され、新しい参照オブジェクトstrNewHがヒープに作成されます。それが正しいか?

いいえ、正しくありません。新しいオブジェクトは作成されません。strNew"doo"文字列プールにある を参照しており、参照していたものと同じオブジェクトstrLです。strNewH"foo"、文字列プールにない を参照しており、参照していたものと同じオブジェクトstrです。

于 2019-09-06T11:24:34.820 に答える