最近,我尝试弄清WeakHashMap
的工作方式。如代码所示,map.isEmpty()
将在System.gc()
和size
被强引用之后返回true,那么谁来改变大小?
WeakHashMap<UniqueKey, BigImage> map = new WeakHashMap<>();
UniqueKey key = new UniqueKey("abc");
map.put(key, new BigImage());
BigImage value = map.get(key);
assertNotNull(value);
key = null;
System.gc();
Thread.sleep(1000);
assertTrue(map.isEmpty());
答案 0 :(得分:3)
内部查看实施情况:
public int size() {
if (size == 0)
return 0;
expungeStaleEntries();
return size;
}
专门用于使用{
的expungeStaleEntries
方法
/**
* Reference queue for cleared WeakEntries
*/
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
此方法还会更新size
,然后再返回给您。
答案 1 :(得分:1)
调用size()
方法时,过时的条目将被删除。
size()
方法在内部调用私有方法expungeStaleEntries()
,以删除陈旧的条目(当然,如果还不为空)。