WeakReference to String和String常量

我从维基百科看到了关于弱引用的这个例子:

import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) throws InterruptedException { WeakReference r = new WeakReference(new String("I'm here")); WeakReference sr = new WeakReference("I'm here"); System.out.println("before gc: r=" + r.get() + ", static=" + sr.get()); System.gc(); Thread.sleep(100); // only r.get() becomes null System.out.println("after gc: r=" + r.get() + ", static=" + sr.get()); } } 

我不明白在这种情况下为什么只有r.get()返回null而不是sr.get()。 有人能让我知道原因吗?

非常感谢。

字面意思"I'm here"是一个编译时常量字符串,因此被放置在常量字符串池中,直到java 7才从未被垃圾收集。 这意味着sr指向永远不会被垃圾收集的对象。 另一方面, r指向该字符串的副本,该副本不在任何const池中,因此有资格进行收集。

有关此字符串池的更多详细信息,请参阅String.intern()的文档

如果已通过程序或垃圾收集器清除此引用对象,则此方法返回null。

这里解释得很好