equals和hashCode方法必须一致,这意味着当两个对象根据equals方法相等时,它们的hashCode方法应该返回相同的哈希值.
如果我们不覆盖hashCode()方法,Java将返回唯一的哈希代码.
class HashValue {
int x;
public boolean equals(Object oo) {
// if(oo instanceof Hashvalue) uncommenting ths gives error.dunno why?
// :|
HashValue hh = (HashValue) oo;
if (this.x == hh.x)
return true;
else
return false;
}
HashValue() {
x = 11;
}
}
class Hashing {
public static void main(String args[]) {
HashValue hv = new HashValue();
HashValue hv2 = new HashValue();
System.out.println(hv.hashCode());
System.out.println(hv2.hashCode());
if (hv.equals(hv2))
System.out.println("EQUAL");
else
System.out.println("NOT EQUAL");
}
}
Run Code Online (Sandbox Code Playgroud)
为什么取消注释该行会产生编译错误?
如果对象具有不相等的哈希码,为什么即使默认哈希码变化,它们也显示相等?
首先,在该行中,您需要更改Hashvalue为HashValue,因为您的类实际上已被调用HashValue.
然后,取消注释该行为您提供:
public boolean equals(Object oo) {
if(oo instanceof HashValue)
HashValue hh = (HashValue)oo;
if (this.x==hh.x) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这有一些问题:
这不会编译,因为hh当你最终使用它时,它不在范围内.
第一个if语句应该确保在比较两个不是HashValues的东西(即抛出异常)时根本不运行该函数,或者它应该返回,false因为HashValues永远不会等于其他类型的对象.我通常更喜欢回到false抛出异常.
第二个if语句是多余的,因为您只是返回条件评估的内容.
像这样重写你的方法:
public boolean equals(Object oo) {
if(!(oo instanceof Hashvalue)) {
return false;
}
HashValue hh = (HashValue)oo;
return (this.x == hh.x);
}
Run Code Online (Sandbox Code Playgroud)
这也不太对劲.为了确保所有相等的对象具有相同的哈希代码,您必须重写hashCode()的HashValue,而且你必须确保它不辜负保证.在这里,你可以添加这个:
// inside HashValue
int hashCode() {
return x;
}
Run Code Online (Sandbox Code Playgroud)
实现是微不足道的,因为你的对象只是一个包装器int.随着对象越来越复杂,你需要更加思考.
| 归档时间: |
|
| 查看次数: |
4984 次 |
| 最近记录: |