为了账号安全,请及时绑定邮箱和手机立即绑定

Java7 WeakHashMap isEmpty() 似乎有误

Java7 WeakHashMap isEmpty() 似乎有误

Cats萌萌 2022-09-07 21:11:39
我试图使用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() 不一致。有人能帮我理解它吗?多谢。
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

你应该阅读 WeakHashMap 的 javadoc:

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

简而言之,你所看到的效果是完全有效的。


查看完整回答
反对 回复 2022-09-07
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

WeakHashMap::isEmpty 说:


...此结果是快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前删除,因为它们不再被引用。


因此,您会期望 在 GC 之后和访问之后返回正确的值。此代码演示了以下内容:isEmpty()


public class Scratch1 {

    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();


        // map not internally accessed at this point

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


        // let's access the Map's internals (and hopefully coerce

        // it into removing no-longer-referenced keys)

        System.out.println(map.keySet()

                              .isEmpty());


        // map HAS now been accessed

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

    }


}

收益 率:


false

true

true


查看完整回答
反对 回复 2022-09-07
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信