在WeakHashMap中使用到了弱引用来实现,其中的expungeStaleEntries()方法一个类型转换问题
/**
* Expunges stale entries from the table.
*/
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
@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 (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
if (prev == e)
table[i] = next;
else
prev.next = next;
// Must not null out e.next;
// stale entries may be in use by a HashIterator
e.value = null; // Help GC
size--;
break;
}
prev = p;
p = next;
}
}
}
}
@SuppressWarnings("unchecked")
Entry<K,V> e = (Entry<K,V>) x;
这里x为什么能转换为(Entry<K,V>),队列queen里记录的不是Entry的一个key吗,为什么能转换为Entry<K,V>?
这个其实就是看
queue
中存放的是什么?那只有一步一步跟下去:看
put
方法:看这两行,
put
方法,生成了一个Entry,这个构造方法接收了queue
看
Entry
看构造方法中
super(key, queue)
这句,找父类看
WeakReference
还要往父类跟
看
Reference
重点来了:
this.queue.enqueue(this)
this.queue.enqueue(this)
this.queue.enqueue(this)
这里进入队列的是
this
,this
指的是谁啊,就是Entry
啊,所以取数据的时候,也就是Entry
。结束。