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

このような誤解を招く結果を避けるにはどうすればよいですか? 値とキーは 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 に答える