javaのListの比較方法

Java画像

Listの比較で困った

以下のようにフルーツの名前と値段を保持しているクラスがあります。

そのクラスのListが2つあります。

以下のように2つのリストの比較をしようとするとfalseが返ってきます。

リストの中身は同じはずなのにおかしい….

ちなみに

以下のようにプリミティブ型のリストの場合はちゃんとtrueが返ってくる

解決策

結論から言うとequals,hashcodeをオーバーライドする必要があります。

実装は以下のようになります。

これで以下のコードでtrueが返ってくるようになります。

解説

equalsメソッド

公式のリファレンスはこちら↓

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#equals-java.lang.Object-

コードについては特に記述することがないので、equalsをオーバライドする時の注意点についてまとめておきます。

①equalsをオーバライドするときは、常にhashCodeをオーバライドする

②あまりにも賢くなろうとしないこと

③equals宣言中のObjectを他の型で置き換えてはいけない

effective java

③については以下のように書いてはいけないということです。

hashCodeメソッド

公式のリファレンスはこちら↓

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#hashCode–

hashCodeの実装方法は以下の通りです。

  1. resultという名のint変数を宣言し、クラス内の意味のあるフィールドに対するハッシュコードで初期化する
  2. クラス内の全ての意味のあるフィールドfに対して[result = 31 * result + Type.hashCode()]を行う

サンプルコードでみるとこんな感じ

なぜ31なのかというと素数だからだそうです。(伝統的にそうらしい)

参考書籍、サイト

Effective Javaの項目10,11を参考に実装をしました。

以下のサイトもかなり参考にさせていただきました。

コメントを残す

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

CAPTCHA


error: Content is protected !!