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
对象的隐式引用。”