僕はJavaのWeakHashMapを勘違いしていたというメモ

JavaWeakHashMapというクラスがあって、僕はこれを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に実際動作させたコードを置いておきます。