2

我想在WeakHashMap中存储一些数据,但是有一个问题。假设我们有一个代码:

public class WeakMapTest {
    public static void main(String[] args) {
        WeakHashMap<Object, Object> map = new WeakHashMap<Object, Object>();
        map.put(null, 0);
        map.put(new Integer(1), null);
        map.put(new Integer(2), 2);
        System.out.println(map.get(new Integer(2)));

        System.gc(); //assume this call made implicitly by JVM
        if (map.containsKey(new Integer(2))) {
            System.out.println(map.get(new Integer(2)));
        } else {
            System.out.println("Key is deleted");
        }
    }
}

输出将是

2
Key is deleted

这是合乎逻辑的。

但还有另一种情况:

    if (map.containsKey(new Integer(2))) {
        System.gc(); //assume this call made implicitly by JVM
        System.out.println(map.get(new Integer(2)));
    } else {
        System.out.println("Key is deleted");
    }

结果不太好:

2
null

我怎样才能避免这种误导性的结果?请记住,值和键可以为空。

4

1 回答 1

1

在我写这个问题时找到我的解决方案,所以决定分享。

Object value = map.get(new Integer(2));
if (map.containsKey(new Integer(2))) {
    System.gc(); // can happen here
    System.out.println(value);
} else {
    System.out.println("Key is deleted");
}

我必须先获得价值,然后才能检查密钥是否存在。这样我就可以免受错误结果的影响。目前的结果是:

2
2

这是正确的,至少对我来说是这样。

于 2014-05-12T11:46:12.870 回答