Enthuware シミュレーターからいくつかのサンプルの質問をしています。質問例はこちら
public class GoodOne
{
int theval;
public int hashCode()
{
return theval%3;
}
public boolean equals(Object obj)
{
try{
// 1 insert code here.
}catch(Exception e) {
return false;
}
}
}
オプションを以下に示します
return true;
return this == obj? true : (theval%3 == 0 && ((GoodOne)obj).theval%3==0) ? true :false;
return theval%2 == 0? true :false;
return ( (int)Math.random())*10%3 == 0? true :false;
. Math.random() が 0.0 から 1.0 (1.0 を含まない) の間の double を返すと仮定します。return false;
シミュレーターが選択した正解は、この説明が与えられたオプション 2 です。
これは、オブジェクトが
theval % 3
0 の場合に等しいと見なされることを意味します。さらに、2 つのオブジェクトが等しいと判断された場合、それらのハッシュコード (theval % 3
) は常に同じ (ゼロ) になります。したがって、hashCode および equals メソッドの要件を満たします。覚えておくべき規則は次のとおりです。
equals()
メソッドが true を返す場合、hashCode()
2 つのオブジェクトの は同じでなければなりません。逆は望ましいですが、必須ではありません。さらに、equals メソッドは次の規則に従う必要があります: 再帰的でなければなりません: 任意の参照値 x に対して
x.equals(x)
true を返す必要があります。対称である必要があります: 参照値 x および y について、x.equals(y)
true を返す場合にのみ true を返す必要がありy.equals(x)
ます。推移的である必要があります。x、y、および z の参照値に対して、x.equals(y)
true を返し、true をy.equals(z)
返す場合は、true を返すx.equals(z)
必要があります。一貫性がある必要があります。参照値 x および y に対してx.equals(y)
、オブジェクトの equals 比較で使用される情報が変更されていない場合、一貫して true を返すか、一貫して false を返すの複数の呼び出し。null でない参照値 x の場合、x.equals(null)
false を返す必要があります。オプション 1 は、すべてのオブジェクトが等しいと見なされ、
hashCode()
すべてのオブジェクトに対して同じ値を返さなければならないため、間違っていますが、そうではありません。3 の倍数はすべて 0 であるため、オプション 2 は正しいです。
hashCode()
したがって、3equals()
の倍数のすべてに対してメソッドで true を返すと、条件が満たされます。また、オブジェクトがそれ自体と比較された場合にも true を返します。オプション 3 は正しくありません。2 と 6 は等しいと見なされますが、ハッシュ コードは異なります (2 と 0)。
どのオブジェクトが等しいと見なされるかを判断できないため、オプション 4 は誤りです。
その説明が理解できません。このサンプルでオプション 2 が正しい理由を誰か詳しく教えてください。ありがとう。