新创建的字符串将在哪里?堆内存还是字符串常量池?

Where will be the newly created String? Heap memory or String constant pool?

根据Java,

有两个地方存储字符串。字符串文字池和堆内存根据其创建。我需要知道,当将字符串赋值给另一个字符串时,新创建的字符串将存储在哪里?

我已经对堆中和字符串池中的字符串类型进行了赋值操作。我得到了这样的结果。

    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 引用对象。正确吗?

你有一些误解。

字符串池也是堆的一部分。您可能想问这些字符串是在字符串池中还是 堆的其他部分 .

您似乎还认为赋值会创建新对象。 他们没有。变量和对象是不同的东西。在这两行之后:

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

变量 str 引用到不在字符串池中的字符串对象 "foo"。变量 strL 引用 字符串对象 "doo",它在字符串池中。

(注意单词"refers")

当您分配 String 变量时,您只是在更改它们所指的内容。这里:

String strNew = strL;

您正在使 strNew 引用与 strL 引用的对象相同的对象。

同样,当您将某物设置为 null 时,它就没有任何引用。它所指的对象不一定被销毁。

那么关于你的问题:

According to this output, a new referenced object for strNew is created in string pool and a new referenced object for strNewH is created in heap. Is it correct?

不,这是不正确的。没有创建新对象。 strNew 指的是 "doo",它在字符串池中,与 strL 指的是同一个对象。 strNewH 指的是 "foo",它不在字符串池中,与 str 指的是同一个对象。