JavaのHashMapでキーに独自クラス
今まではint、Stringのキーでしか使用したことのなかったHashMapですが、
独自クラスをキーとして使用する機会がありました。
そこで詰まったので覚書。
起こったことは、
- キーの存在判定(containsKey)がtrueとなるはずの状態:キーがすでにHashMapにいる状態でfalseになる
- Map#containsKey()のJavaDocでは( key == null ? k == null : key.equals(k) )となるキーkがいればtrueとなっている
- equals()は実装し、kとkeyはオブジェクトとしては異なる( k != key )がオブジェクトの性質?としては等しい( key.equals(k) )状態
- このとき、equals()にログ出力を挟んでみたが出力はなかった:HashMap#containsKey()ではequals()は使用されていない?
とかなんとかでいろいろ調べていると、以下の掲示板に辿りついた。
http://stackoverflow.com/questions/4611764/java-hashmap-containskey-doesnt-call-equals
ずばり同じ内容で、要は
HashMap#containsKey()は、key.hashcode() == k.hashcode()がtrueの場合に初めてequals()を使用する
でした。
よって、HashMapのキーに独自クラスを使用する場合はequals()とhashcode()を実装する必要があるということに。
まあ確かにHashMapっていう名前だし、hashcode()を使用しても文句はないんだけど、JavaDocのHashMap#containsKey()に明示してほしかった。