Java7 WeakHashMap isEmpty() 似乎有误

我试图使用Java7的WeakHashMap,我发现它的isEmpty()方法给了我错误的结果。


import java.util.Map;

import java.util.WeakHashMap;


public class Test

{


    public static void main(final String[] args)

    {

        final Map<String, Boolean> map = new WeakHashMap<>();


        String b = new String("B");

        map.put(b, true);

        b = null;


        System.gc();

        System.out.println(map.isEmpty());

        System.out.println(map.keySet().isEmpty());

        System.out.println(map);

    }


}

实际结果:




{}


也就是说,


map.isEmpty() 和 map.keySet().isEmpty() 不一致。有人能帮我理解它吗?多谢。


Cats萌萌
浏览 89回答 2
2回答

HUH函数

你应该阅读&nbsp;WeakHashMap&nbsp;的 javadoc:该类的行为部分取决于垃圾回收器的操作,因此几个熟悉的(尽管不是必需的)不变量不适用于此类。由于垃圾回收器可能随时丢弃密钥,因此 a 的行为可能就像未知线程正在静默删除条目一样。特别是,即使您在实例上进行同步并且不调用其赋值函数方法,size&nbsp;方法也可能随着时间的推移返回较小的值,isEmpty&nbsp;方法返回&nbsp;false&nbsp;然后返回 true,对于返回该方法,稍后对于给定键,对于该方法返回给定键的值,但稍后返回 , 用于返回的方法和返回以前似乎在映射中的键的方法,以及连续检查键集、值集合和条目集以生成连续较少数量的元素。WeakHashMapMapWeakHashMapWeakHashMapcontainsKeytruefalsegetnullputnullremovefalse简而言之,你所看到的效果是完全有效的。

慕的地8271018

WeakHashMap::isEmpty 说:...此结果是快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前删除,因为它们不再被引用。因此,您会期望 在 GC 之后和访问之后返回正确的值。此代码演示了以下内容:isEmpty()public class Scratch1 {&nbsp; &nbsp; public static void main(final String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; final Map<String, Boolean> map = new WeakHashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; String b = new String("B");&nbsp; &nbsp; &nbsp; &nbsp; map.put(b, true);&nbsp; &nbsp; &nbsp; &nbsp; b = null;&nbsp; &nbsp; &nbsp; &nbsp; System.gc();&nbsp; &nbsp; &nbsp; &nbsp; // map not internally accessed at this point&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(map.isEmpty());&nbsp; &nbsp; &nbsp; &nbsp; // let's access the Map's internals (and hopefully coerce&nbsp; &nbsp; &nbsp; &nbsp; // it into removing no-longer-referenced keys)&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(map.keySet()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .isEmpty());&nbsp; &nbsp; &nbsp; &nbsp; // map HAS now been accessed&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(map.isEmpty());&nbsp; &nbsp; }}收益 率:falsetruetrue
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java