WeakHashMap原理解读

WeakHashMap如何实现在GC进行垃圾回收时,删除key-value键值对。


WeakHashMap中Entry定义如下,继承了WeakReference

class Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V>{
     Entry(K key , V value ,
           ReferenceQueue<K> queue ,
              int hash , Entry<K,V> next ) {
            super ( key , queue );
            this . value = value ;
            this . hash   = hash ;
            this . next   = next ;
        }
}


可以看到只有key会作为弱引用,value并没有做为弱引用。因此当GC清理弱引用时,只会清理key对象的内存,并将该entry加入到queue中。

expungeStaleEntries函数中会对queue进行遍历,用于删除“key已经被清理”的value。

private void expungeStaleEntries() {
    Entry<K,V> e;
        while ( (e = (Entry<K,V>) queue.poll()) != null) {
            int h = e.hash;
            int i = indexFor(h, table.length);

            Entry<K,V> prev = table[i];
            Entry<K,V> p = prev;
            while (p != null) {
                Entry<K,V> next = p.next;
                if (p == e) {
                    if (prev == e)
                        table[i] = next;
                    else
                        prev.next = next;
                    e.next = null;  // Help GC
                    e.value = null; //  "   "
                    size--;
                    break;
                }
                prev = p;
                p = next;
            }
        }
    }

expungeStaleEntries在get、put、remove、size等map常用方法中都会直接或者间接的调用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值