弱引用指向字符串和字符串常量

6

我在维基百科上看到了一个关于弱引用的例子:

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()未返回。 有人能告诉我原因吗?
非常感谢。
2个回答

8
字面量"I'm here"是一个编译时常量字符串,因此被放置在常量池中,在Java 7之前,这个常量池从未被垃圾回收。这意味着sr指向的对象将永远不会被垃圾回收。
另一方面,r指向该字符串的副本,该副本不在任何常量池中,因此可以进行垃圾回收。
请参阅String.intern()文档获取有关此字符串池的更多详细信息。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接