上級 › equals と hashCode を必ずセットで実装する理由 › パターン5
equals と hashCode を必ずセットで実装する理由
HashSetやHashMapが先にハッシュ値で振り分けるためです。
1 import java.util.Objects; 2 3 public class Main { 4 static class Point { 5 int x, y; 6 Point(int x, int y) { this.x = x; this.y = y; } 7 @Override public boolean equals(Object o) { 8 if (!(o instanceof Point)) return false; 9 Point p = (Point) o; 10 return x == p.x______________; ^ 11 } 12 @Override public int hashCode() { return Objects.hash(x, y); } 13 } 14 public static void main(String[] args) { 15 System.out.println(new Point(1, 2).equals(new Point(1, 9))); 16 } 17 }
出力: true期待: false (コンパイルは通っています)
空欄を埋めてビルドを通す
equalsでxしか比較していないため、yが違っても等しいと判定されてしまいます。hashCodeが使う全フィールドをequalsでも比較します。
次の問題