![expungeStaleEntries函数解析 expungeStaleEntries函数解析](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
1 /**
* Reference queue for cleared WeakEntries
*/
// 所有Entry在构造时都传入该queue
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
/**
* Expunges stale entries from the table.
*/
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
// e 为要清理的对象
@SuppressWarnings("unchecked")
Entry<K,V> e = (Entry<K,V>) x;
int i = indexFor(e.hash, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> p = prev;
// while 循环遍历冲突链
while (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
if (prev == e) //表示x是桶链表的第一个元素
table[i] = next;
else
prev.next = next; //跳过x元素
// Must not null out e.next;
// stale entries may be in use by a HashIterator
// 可以看到这里把value赋值为null,来帮助 GC 回收强引用的value
e.value = null; // Help GC
size--;
break;
}
prev = p;
p = next;
}
}
}
}