WeakHashMap原理
WeakHashMap map = new WeakHashMap();String k = new String("1");map.put(k, 1);System.out.println();k = null; // 去除对key的强引用System.out.println(map.size()); // 1System.gc();System.out.println(map.size()); // 0
WeakHashMap 中key在没有强引用的时候,如果发送了gc,该key就会被回收。为了保证一致性,该Map中回收方法为expungeStaleEntries。
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;elseprev.next = next;// Must not null out e.next;// stale entries may be in use by a HashIteratore.value = null; // Help GCsize--;break;}prev = p;p = next;}}}}
以上代码会遍历引用队列,然后删除已被回收的键值对。该方法会在getTable(获取表),size(获取表大学)、resize(扩容)的时候使用。
而getTable会在增删改查的时候调用。
因此,expungeStaleEntries方法会在WeakHashMap增删改查、扩容的地方调用。