我正在做一些来自 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)。return false;
模拟器选择的正确答案是选项2,并给出了这个解释。
这意味着如果对象
theval % 3
为 0,则认为对象相等。此外,如果确定两个对象相等,则它们的哈希码 (theval % 3
) 将始终相同(零)。所以它满足 hashCode 和 equals 方法的要求。要记住的规则是:如果
equals()
方法返回 true,hashCode()
则两个对象的 必须相同。反过来是可取的,但不是必需的。此外,equals 方法必须遵循以下规则: 它应该是 自反的:对于任何引用值 x,
x.equals(x)
应该返回 true。它应该是对称的:对于任何参考值 x 和 y,x.equals(y)
当且仅当y.equals(x)
返回 true 时才应该返回 true。它应该是可传递的:对于任何参考值 x、y 和 z,如果x.equals(y)
返回 true 并y.equals(z)
返回 true,则x.equals(z)
应该返回 true。它应该是一致的:对于任何参考值 x 和 y,x.equals(y)
只要没有修改对象上的 equals 比较中使用的信息,多次调用始终返回 true 或始终返回 false。对于任何非空引用值 x,x.equals(null)
应该返回假。选项 1 是错误的,因为它将导致所有对象都被视为相等,因此
hashCode()
必须为所有对象返回相同的值,但事实并非如此。选项 2 是正确的,因为
hashCode()
对于所有 3 的倍数都是 0。因此,如果我们在equals()
方法中对所有 3 的倍数返回 true,则条件将满足。如果对象与自身进行比较,它也会返回 true。选项 3 不正确,因为 2 和 6 将被视为相等,但它们的哈希码将不同(2 和 0)。
选项 4 是错误的,因为我们无法确定哪些对象将被视为相等。
我无法理解它的解释。有人可以详细说明为什么选项 2 在此示例中是正确的。谢谢。