行く記憶の流れは絶えずして

戻ってこないのでメモするところ

JavaのHashMapでキーに独自クラス

今まではint、Stringのキーでしか使用したことのなかったHashMapですが、

独自クラスをキーとして使用する機会がありました。

そこで詰まったので覚書。

 

 

起こったことは、

  1. キーの存在判定(containsKey)がtrueとなるはずの状態:キーがすでにHashMapにいる状態でfalseになる
  2. Map#containsKey()のJavaDocでは( key == null ? k == null : key.equals(k) )となるキーkがいればtrueとなっている
  3. equals()は実装し、kとkeyはオブジェクトとしては異なる( k != key )がオブジェクトの性質?としては等しい( key.equals(k) )状態
  4. このとき、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()に明示してほしかった。