上級 › 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の計算に使うフィールドを、集合に入れたあとで書き換えるとハッシュ値の格納位置とずれ、探せなくなります。
次の問題