上級 › equals と hashCode を必ずセットで実装する理由 › パターン2
equals と hashCode を必ずセットで実装する理由
HashSetやHashMapが先にハッシュ値で振り分けるためです。
1 import java.util.HashSet; 2 import java.util.Set; 3 4 public class Main { 5 static class P { 6 int id; 7 P(int id) { this.id = id; } 8 @Override public boolean equals(Object o) { return o instanceof P && ((P) o).id == id; } 9 ______________________________________________________ ^ 10 } 11 public static void main(String[] args) { 12 Set<P> s = new HashSet<>(); 13 s.add(new P(1)); s.add(new P(1)); 14 System.out.println(s.size()); 15 } 16 }
出力: 2期待: 1 (コンパイルは通っています)
空欄を埋めてビルドを通す
equalsを上書きしたらhashCodeも必ず上書きします。HashSetは先にハッシュ値で振り分けるためです。
次の問題