僕はJavaのWeakHashMapを勘違いしていたというメモ
JavaにWeakHashMapというクラスがあって、僕はこれをvalueを弱参照で持てるHashMapだと思ってたんですけど、本当はkeyを弱参照で持つHashMapだったのでメモしておきます。
どういうことかって言うと、僕はこんなことを期待していたわけです。
Map<String, String> m = new WeakHashMap<String, String>(); String key = new String("hoge"); String value = new String("fuga"); m.put(key, value); System.out.println(m.containsKey("hoge")); // => true value = null; System.out.println(m.containsKey("hoge")); // => falseとおもってたらtrueだった
valueの強参照がなくなると、mapからそのエントリが削除されるイメージです。
でも、実際はこうでした。
Map<String, String> m = new WeakHashMap<String, String>(); String key = new String("hoge"); String value = new String("fuga"); m.put(key, value); System.out.println(m.containsKey("hoge")); // => true key = null; System.out.println(m.containsKey("hoge")); // => true/タイミング次第でfalse System.gc(); System.out.println(m.containsKey("hoge")); // => false
キーへの強参照をなくして、さらにGCが動いたあとにmapからエントリが削除されるようです。
ideoneに実際動作させたコードを置いておきます。