WeakHashMap如何实现在GC进行垃圾回收时,删除key-value键值对。
WeakHashMap中Entry定义如下,继承了WeakReference
}
可以看到只有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常用方法中都会直接或者间接的调用。