Java:WeakHashMap的条目逐出时,谁更改大小?

时间:2018-10-05 10:22:00

标签: java collections

最近,我尝试弄清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());

2 个答案:

答案 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(),以删除陈旧的条目(当然,如果还不为空)。