首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java7 WeakHashMap isEmpty()似乎错了

Java7 WeakHashMap isEmpty()似乎错了
EN

Stack Overflow用户
提问于 2019-03-28 19:53:15
回答 2查看 100关注 0票数 4

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

代码语言:javascript
复制
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()不一致。有人能帮我理解一下吗?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-28 20:04:15

WeakHashMap::isEmpty说:

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

因此,您希望isEmpty()在GC 之后返回正确的值,在访问后返回。下面的代码说明了这一点:

代码语言:javascript
复制
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());
    }

}

产量:

代码语言:javascript
复制
false
true
true
票数 2
EN

Stack Overflow用户

发布于 2019-03-28 19:59:14

您应该阅读WeakHashMap的javadoc。

WeakHashMap类的行为在一定程度上取决于垃圾收集器的操作,因此几个熟悉的(尽管不是必需的) Map不变量对于这个类不成立。因为垃圾收集器可以在任何时候丢弃键,所以WeakHashMap的行为可能就像一个未知的线程正在悄悄地删除条目一样。特别是,即使您在一个size实例上同步并且不调用它的任何变体方法,随着时间的推移, isEmpty 方法也有可能返回较小的值,isEmpty方法可以返回 false ,而对于containsKey方法返回true,以及稍后对给定密钥返回false,对于get方法返回给定键的值但稍后返回null,对于put方法返回nullremove方法返回以前在映射中的键的false,以及对键集、值集合和条目集的连续检查,以依次生成较小数量的元素。

最重要的是你所看到的效果是完全有效的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55405864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档