我们知道当我们按照这样的新关键字创建新的String对象时:
String str = new String("New String Will Have Two Objects");
它将创建两个对象,一个在Java堆内存上,另一个在String池上。
那么当我们调用access "str"
访问哪个字符串对象时(堆对象或字符串池对象)?
根据我的理解,可以访问字符串池对象,如果是,那么堆对象会发生什么?
答案 0 :(得分:7)
如果要使用new
String str = new String("New String Will Have Two Objects");
在这种情况下,JVM将在普通(非池)堆内存中创建一个新的字符串对象,文字"New String Will Have Two Objects"
将放在字符串常量池中。变量str
将引用堆中的对象(非池)。
方法'intern()'用法
这是java docs
最好的描述
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
String str = new String("New String Will Have Two Objects");
str.intern();
答案 1 :(得分:0)
new String
在堆上创建一个新字符串。此字符串的引用将分配给str
。
答案 2 :(得分:0)
字符串文字始终从字符串文字池中引用它们。这意味着他们总是引用它们,因此不符合垃圾收集http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
的条件