我已经看到了几个类似的问题,但是他们的回答并没有真正回答我的问题。
当我们编辑字符串并创建一个新字符串时,旧字符串在哪里?
String s1 = "Hello"
s1 += "World"
我们有一个字符串Hello,但是随后创建了一个新字符串,它是HelloWorld。
字符串Hello是否仍在字符串池中(我想不是,因为我们丢失了对它的引用)。 垃圾收集器会破坏它吗?
如果我们创建一个新的字符串并使用intern方法该怎么办。此字符串将从池中获取吗?
String s1 = "Hello";
s1 += "World";
String s2 = "Hello";
在this topic中,斯蒂芬C说过
如果字符串无法访问,则将对其进行垃圾回收
但是我做了这样的事情:
String s1 = "Hello";
System.out.println(System.identityHashCode(s1));
s1 += "World";
System.gc();
String s2 = "Hello";
System.out.println(System.identityHashCode(s2));
并且它打印了相同的身份哈希码,尽管我丢失了对“ Hello”字符串的引用,而一个新字符串应该已经打印了另一个身份哈希码。
他也这么说
这意味着只要方法可以执行,字符串就可以访问。
但是我进行了与上述类似的实验,该方法创建了一个字符串,然后在另一种方法中,我创建了相同的字符串(在使用System.gc之前)并打印出了相同的身份哈希码。 >
如果我丢失对2种情况的引用,为什么GC不会销毁该字符串?