2

根据 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 引用对象。这是对的吗?

4

1 回答 1

2

你有一些误解。

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

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

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

该变量str 引用了一个字符串对象"foo",它不在字符串池中。该变量strL 引用一个字符串对象"doo",即在字符串池中。

(注意“指”这个词)

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

String strNew = strL;

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

类似地,当您将某些内容设置为 null 时,您将使其不引用任何内容。它所指的对象不一定被破坏。

至于你的问题:

根据这个输出,strNew在字符串池中创建了一个新的引用对象,strNewH在堆中创建了一个新的引用对象。这是对的吗?

不,这是不正确的。没有创建新对象。strNew引用"doo",它在字符串池中,并且与引用的对象是同一个对象strLstrNewH引用"foo",它不在字符串池中,并且与引用的对象是同一个对象str

于 2019-09-06T11:24:34.820 回答