Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否要从字符串池中删除旧字符串?_Java - Fatal编程技术网

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

Java 是否要从字符串池中删除旧字符串?,java,Java,我见过几个类似的问题,但他们的答案并不能真正回答我的问题 当我们编辑一个字符串并创建一个新字符串时,旧字符串去哪里了 String s1 = "Hello" s1 += "World" 我们有一个字符串Hello,但随后创建了一个新字符串,它是HelloWorld 字符串Hello仍然在字符串池中吗(我想没有,因为我们失去了对它的引用)。 垃圾收集器会毁掉它吗 如果我们创建一个新字符串并使用intern方法呢。这根绳子要从游泳池里拿出来吗 String s1 = "Hello"; s1 +=

我见过几个类似的问题,但他们的答案并不能真正回答我的问题

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

String s1 = "Hello"
s1 += "World"
我们有一个字符串Hello,但随后创建了一个新字符串,它是HelloWorld

字符串Hello仍然在字符串池中吗(我想没有,因为我们失去了对它的引用)。 垃圾收集器会毁掉它吗

如果我们创建一个新字符串并使用intern方法呢。这根绳子要从游泳池里拿出来吗

String s1 = "Hello";
s1 += "World";

String s2 = "Hello";
年,斯蒂芬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之前),它打印出相同的标识哈希代码


如果我失去了对字符串的引用,为什么GC不销毁我2个案例中的字符串?

运行测试1000次。GC在运行时运行。你不能得到确定性的结果。据我所知,字符串池中的字符串不会被垃圾收集。请不要。如果您认为重复的内容不适用,请编辑您的问题以解释原因,然后等待重新开放的投票。@SotiriosDelimanolis我道歉。我创建了一个新问题,因为我编辑了前一个问题,并添加了额外的解释,但没有重新打开。我想我应该等得更久。引用的答案还说:“在实践中,与字符串文本相对应的
String
对象通常不会成为垃圾收集的候选对象。这是因为在每个使用该文本的方法的代码中都有对
String
对象的隐式引用。”