根据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创建一个新的引用对象。正确吗?
答案 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
所引用的对象相同。