在WeakHashMap中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。“弱键”通过WeakReference和ReferenceQueue实现。WeakHashMap的key是“弱键”,即是WeakReference类型的; ReferenceQueue是一个队列,它会保存被 GC回收的“弱键”。实现步骤是:
(1) 新建WeakHashMap,将“键值对”添加到 WeakHashMap中。 实际上, WeakHashMap是通过数组table保存 Entry(键值对) ;每一个 Entry实际上是一个单向链表,即Entry是键值对链表。
(2)当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。
(3) 当下一次我们需要操作WeakHashMap时,会先同步table和 queue。table 中保存了全部的键值对,而 queue中保存被GC 回收的键值对;同步它们,就是删除 table中被GC 回收的键值对。
下面给出WeakHashMap的示例:
<span style="font-family:Microsoft YaHei;font-size:18px;">import java.util.WeakHashMap;
public class TestWeakHashMap
{
public static void main(String[] args)
{
WeakHashMap<String,String> whm = new WeakHashMap<String,String>();
//三个键都是匿名字符串对象(没有其它引用)
whm.put(new String("1"),new String("a"));
whm.put(new String("2"),new String("b"));
//添加一个键值对,该Key是一个系统缓存的字符串对象
whm.put("3",new String("c"));
//输出{1=a, 2=b, 3=c}
System.out.println(whm);
//垃圾回收
System.gc();
System.runFinalization();
//输出{3=c}
System.out.println(whm);
}
}
</span>