私はOCJP(旧SCJP)のために勉強していて、LinkedHashSetを使用する次の例に出くわしました:
public class Test{
int size;
public Test(int s){
this.size = s;
}
@Override
public boolean equals(Object obj) {
return (this.size == ((Test)obj).size);
}
public static void main(String[] args) {
LinkedHashSet<Test> s = new LinkedHashSet<Test>();
s.add(new Test(1));
s.add(new Test(2));
s.add(new Test(1));
System.out.println(s.size());
}
}
ここで、問題は次の場合に表示される内容です:
1) 実装はそのまま
2) hashCode のオーバーライドがクラス Test に次のように挿入されます。
public int hashCode() {return size/5};
コードを実行してコンパイルすると、最初のケースでは set のサイズが 3 であるのに対し、2 番目のケースでは 2 であることが示されます。なぜですか?
ケース 1 では、equals メソッドはオーバーライドされますが、呼び出されることはありません。hashCode メソッドがオーバーライドされていない場合、add() メソッドはオブジェクトの等価性をチェックしないということですか?
ケース 2 では、指定された実装と指定された Test オブジェクトのセットを持つ hashCode は、常に同じ数値を返します。これはデフォルトの hashCode 実装とどのように違うのでしょうか? また、なぜ equals が呼び出されるのでしょうか?