Code Fix

上級 › equals と hashCode を必ずセットで実装する理由 › パターン4

equals と hashCode を必ずセットで実装する理由

HashSetやHashMapが先にハッシュ値で振り分けるためです。

 1  import java.util.HashSet;
 2  import java.util.Objects;
 3  import java.util.Set;
 4  
 5  public class Main {
 6      static class P {
 7          int id;
 8          P(int id) { this.id = id; }
 9          @Override public boolean equals(Object o) { return o instanceof P && ((P) o).id == id; }
10          @Override public int hashCode() { return Objects.hash(id); }
11      }
12      public static void main(String[] args) {
13          Set<P> set = new HashSet<>();
14          P p = new P(1);
15          set.add(p);
16          p.id = __;
                    ^
17          System.out.println(set.contains(p));
18      }
19  }
出力: false期待: true (コンパイルは通っています)

空欄を埋めてビルドを通す

広告
広告スロット(未設定)

equals と hashCode を必ずセットで実装する理由

引数をObjectにする理由も扱います。

このエラーの解説と類題をまとめて見る →

広告
広告スロット(未設定)