JavaのHashSetを使う時に・・・

年末に「世界で戦うプログラミング力を鍛える150問」という本を読んでいるのですが,その問題を解いている時にJavaのHashSetの使用方法で少し悩んだ部分があったので,ここでメモを.

一般に,ハッシュテーブルというと,オブジェクトごとに振られたハッシュ値が等しいかどうかで,オブジェクトが等価であるかどうかを判定するものだと思い込んでいたので,JavaのHashSetでもそういう実装になっているのだろうと思い込んでいました.つまり,HashSetではオブジェクトが既にSet内に存在しているか,存在していないかをObjectクラスのメソッドであるhashCodeというメソッドの戻り値を用いて比較しているのだろうと思ったわけです.

ところが,次のようなコードを書いたところ,実行結果が期待しない結果になってしまいました.

このコードは単にdataという1つの整数値のみを値として持つNodeクラスをLikedListに格納して,そこに重複した要素があれば,それを除去するというものなのですが,これを実行し,適当にdataの値を与えると次のようになりました.

つまり,同じハッシュ値を持つはずのNodeが削除されていないわけです.ここで,hashCodeメソッドが戻す値が違うのだろうか?とかいろいろと思いを巡らせたわけですが,どうもそうではないらしい.調べてみると,JavaのHashSetクラスはオブジェクトの等価判定にequalsメソッドも使っているようなのです.結局何が間違っていたかと言うと,Nodeクラスでオーバーライドすべきequalsメソッドは引数にNodeをとるものではなく,Objectをとるものでなくてはなりませんでした.

修正したNodeクラスのコードは次のようになります.

これを実行したところ正しく重複要素が削除されました.めでたしめでたし.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください