我见过几个类似的问题,但他们的答案并没有真正回答我的问题。
当我们编辑字符串并创建新字符串时,旧字符串去了哪里。
String s1 = "Hello"
s1 += "World"
Run Code Online (Sandbox Code Playgroud)
我们有一个字符串 Hello,但随后创建了一个新字符串,它是 HelloWorld。
字符串 Hello 是否仍在字符串池中(我猜不是,因为我们失去了对它的引用)。垃圾收集器会销毁它吗?
如果我们创建一个新字符串并使用 intern 方法会怎样?该字符串将从池中取出吗?
String s1 = "Hello";
s1 += "World";
String s2 = "Hello";
Run Code Online (Sandbox Code Playgroud)
在这个话题中,Stephen C 说
如果字符串变得无法访问,它们将被垃圾收集
但我做了这样的事:
String s1 = "Hello";
System.out.println(System.identityHashCode(s1));
s1 += "World";
System.gc();
String s2 = "Hello";
System.out.println(System.identityHashCode(s2));
Run Code Online (Sandbox Code Playgroud)
它打印了相同的身份哈希码,尽管我丢失了对“Hello”字符串的引用,并且新的应该打印了另一个身份哈希码。
他还表示
这意味着只要该方法可以执行,该字符串就可以访问。
但我做了一个与上面类似的实验,该方法创建了一个字符串,然后在另一种方法中,我创建了相同的字符串(在使用 System.gc 之前),并打印出相同的身份哈希代码。
如果我丢失了对这两种情况的引用,为什么 GC 不会销毁它们?
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |