weakhashmap
的工作原理与WeakReference
和ReferenceQueue
的结合非常相似-零消息有关。这是一个应该如何工作的简化示例:
public class ReferenceQueuePlayground {
public static void main(String[] args) {
ReferenceQueue<Referent> q = new ReferenceQueue<>();
Referent ref = new Referent();
WeakReference<Referent> weak = new WeakReference<>(ref,q);
ref = null;
// wait for GC to reclaim Referent
while (weak.get() != null) {
System.gc();
}
// this might return null,because ReferenceQueue is notified asynchronously
// but I am assuming the happy path here
Reference<? extends Referent> reference = q.poll();
// this will be false
System.out.println(reference == null);
// this will be true
System.out.println(reference.get() == null);
}
@RequiredArgsConstructor
@Getter
static class Referent {
}
}
这正是weakhashmap
的工作方式-收回referent
并将reference
放在ReferenceQueue
上时会得到通知。在随后的一些操作中,将调用expungeStaleEntries
,该操作基本上将逐个抽取ReferenceQueue
中的元素并对其进行操作。
我遇到的问题:如果referent
现在消失了,如何对他们“起作用”?毕竟这是...HASHMap
,因此要删除该元素,必须知道它是hashCode
。您怎么知道hashCode
即将消失的东西?