是否要从字符串池中删除旧字符串?

时间:2018-08-04 15:17:28

标签: java

我已经看到了几个类似的问题,但是他们的回答并没有真正回答我的问题。

当我们编辑字符串并创建一个新字符串时,旧字符串在哪里?

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不会销毁该字符串?

0 个答案:

没有答案