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

时间:2019-09-06 10:44:13

标签: java string object heap-memory string-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创建一个新的引用对象。正确吗?

1 个答案:

答案 0 :(得分:2)

您有一些误解。

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

您似乎还认为分配可以创建新对象。 它们不是。变量和对象是分开的东西。在这两行之后:

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

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

(注意单词“ refers”)

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

String strNew = strL;

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

类似地,当您将某项设置为null时,则使它不引用任何内容。它所指的对象不一定要销毁。

关于您的问题:

  

根据此输出,在字符串池中创建strNew的新引用对象,并在堆中创建strNewH的新引用对象。正确吗?

否,这是不正确的。没有创建新对象。 strNew引用"doo",它位于字符串池中,并且与strL所引用的对象相同。 strNewH引用"foo",它不在字符串池中,并且与str所引用的对象相同。