新创建的字符串将在哪里?堆内存还是字符串常量池?
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
指的是同一个对象。
根据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 forstrNewH
is created in heap. Is it correct?
不,这是不正确的。没有创建新对象。 strNew
指的是 "doo"
,它在字符串池中,与 strL
指的是同一个对象。 strNewH
指的是 "foo"
,它不在字符串池中,与 str
指的是同一个对象。