我们知道什么时候创建像String value = new String("ABC");
这样的String对象
然后将创建新的String
对象,当我们再次使用值变量value="xyz"
时,将创建一个新的String
对象。
所以我的问题是,之前创建的String
对象将被垃圾收集?
答案 0 :(得分:7)
每当你在JAVA中调用new
时它会在堆中创建一个对象,但是在String literals 的情况下,它将进入字符串常量池。 / p>
示例代码:
String value = new String("ABC");
value = "xyz";
现在在上面的示例代码“ABC”和“xyz”中,字符串文字将转到字符串常量池,不会被垃圾收集,但最后value
指的是字符串常量池中的“xyz”。
所以基本上有3个对象,字符串常量池中有2个,堆中有1个。
此时创建的String对象将被垃圾收集?
new
创建的对象在其范围/生命完成后将被垃圾收集,或者没有对其进行访问的参考。它同样适用于所有对象,包括String。
由于value
引用将指向下一行中字符串常量轮询中值为“xyz”的现有对象,因此以前在堆中使用new
创建的对象符合条件用于垃圾收集,但不是仍在字符串常量池中的“ABC”字符串文字。
尝试将其可视化。
答案 1 :(得分:2)
就像其他的String for String一样,JVM遵循相同的方法,一旦应用程序失去引用它就有资格进行垃圾收集。
对于你的情况,新的字符串(“ABC”)没有被实现,所以它不会进入字符串池,当你再次为“ABC”创建字符串时,会在堆中创建一个新的对象。
String value = new String("ABC");
value = new String("ABC");
在上面的示例中,在执行两个行之后,第一个对象符合垃圾回收的条件。
由value =“xyz”创建的字符串也被实现,因此它将在String池中创建,当你使用value =“xyz”创建String时,前一个对象将从String池返回。
String value ="xyz";
value ="xyz";
在上面的示例中,在执行两行之后,只创建了一个我们引用的Object,因此它不符合垃圾回收的条件。
有关字符串何时进入字符串池的更多详细信息。
是案例
无案例