WeakHashMap总体介绍
WeakHashMap继承自AbstractMap,实现了Map接口,拥有了Map的基础功能。但是与常用的Map(比如HashMap)不同的是,WeakHashMap底层的存储单元Entry采用WeakReference,在GC的时候,会回收K,V。所以WeakHashMap天然比较适合用作缓存,即使K,V丢失,也不会对业务造成影响。
1 | private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> { |
如上代码可以看到Entry继承了WeakReference,在构造函数中super(key, queue)
传入了key和ReferenceQueue。
在调用get(),put(),size()等方法的时候,会执行一个私有方法expungeStaleEntries,如下所示。
1 | private void expungeStaleEntries() { |
#图解WeakHashMap原理
图1
如图1所示,key1,key2,key3虚引用指向Entry1,Entry2,Entry3,每个entry又分别指向v1,v2,v3。GC之后,key2虚引用被垃圾回收。通过执行expungeStaleEntries方法,使得Entry2变成游离态,Entry2也和v2脱离了引用关系。所以Entry2,v2都变成了可被垃圾回收的状态。
图2