本文的示例中需要触发垃圾回收,用了 Java 如何触发垃圾回收 给出的方法。
WeakHashMap 首先是一个 Map,可以用key-value的形式存储数据。
其次,它继承自 WeakReference,当 key 只剩下弱引用时,会以懒处理的方式清理该 key-value 。
懒处理,是指在调用 WeakHashMap 的 size、put、get 等方法时才去清理。
回顾弱引用:WeakReference
当一个对象只有弱引用时,gc时会把该对象回收。
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
String name = new String("ltt"); // new String,可以防止常量池的副作用
WeakReference<String> nameRef = new WeakReference<>(name); // 生成弱引用
System.out.println(nameRef.get()); // ltt
name = null; // 解除强引用
// 触发垃圾回收
System.gc();
System.runFinalization();
System.out.println(nameRef.get()); // null
}
}
运行结果:
ltt
null
WeakHashMap 的使用
import java.util.WeakHashMap;
public class Main2 {
public static void main(String[] args) {
String name = new String("ltt");
WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put(name, 18);
System.out.println(map.size()); // 1
name = null; // 解除强引用
// 触发垃圾回收
System.gc();
System.runFinalization();
// map 中无数据了
System.out.println(map.size()); // 0
}
}
运行结果:
1
0