import java.lang.ref.WeakReference;
public class ReferenceTest {
public static void main(String[] args) {
// 创建一个字符串对象
String str = new String("我爱学java");
// 创建弱引用,让此弱引用引用到"我爱学java"字符串
WeakReference wr = new WeakReference(str);
// 切断str和我爱学java字符串之间的引用
str = null;
// 去除弱引用所引用的对象
System.out.println(wr.get());
// 强制垃圾回收
System.gc();
// 调用finalize方法
System.runFinalization();
// 再次取出弱引用的对象
System.out.println(wr.get());
//=================================================================
Object obj = wr.get();
if (obj == null) {
// 重建一个
wr = new WeakReference(recreateIt());
obj =wr.get();
System.out.println(obj);
}
//再次切断
obj =null;
System.out.println(obj);
}
private static Object recreateIt() {
String str = new String("新的字符串对象");
return str;
}
}
(2)虚引用
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class PhantomReferenceTest {
public static void main(String[] args) {
// 创建一个字符串对象
String str = new String("我爱学java");
// 创建一个引用队列
ReferenceQueue rq = new ReferenceQueue();
// 创建一个虚引用,让虚引用 引用到"我爱学java"
PhantomReference pr = new PhantomReference(str, rq);
// 切断str和我爱学java字符串之间的引用
str = null;
// 并不能通过虚引用获取被引用的对象,输出就为null
System.out.println(pr.get());
// 强制垃圾回收
System.gc();
// 调用finalize方法
System.runFinalization();
// 垃圾回收之后,虚引用将被放在引用队列中
//取出引用队列中最先进入队列引用与pr进行比较
System.out.println(rq.poll() == pr);
}
}
原文:https://www.cnblogs.com/charlypage/p/8902218.html