我读到在java中使用 equals()方法我们还必须覆盖hashcode()方法,并且相等(逻辑)对象应该具有eual哈希码,但这并不意味着参考基础平等!这是我的重写equals()方法的代码,我应该如何覆盖hashcode方法:
@Override
public boolean equals(Object o)
{
if (!(o instanceof dummy))
return false;
dummy p = (dummy) o;
return (p.getName() == this.getName() && p.getId() == this.getId() && p.getPassword() == this.getPassword());
}
我只是想了解它是如何工作的,因此只有三个字段,即 name , id 和 password ,只是尝试比较我在main()中定义的两个对象!我还需要知道是否始终需要来覆盖hashcode()方法以及equals()方法?
答案 0 :(得分:5)
Hashcode平等并不意味着任何东西。但是,哈希码不等式应该意味着equals
将产生错误,并且任何两个相等的项应该始终具有相同的哈希码。
出于这个原因,用equals覆盖hashcode总是明智的,因为许多数据结构都依赖于它。
答案 1 :(得分:0)
在您的代码中,您实际上并未比较字段的值。使用equals()
代替==
来实现同等正确的实施。
return (p.getName().equals(this.getName()) && ...
(请注意,如果getName()
返回null,上面的代码可能会导致空引用异常:您可能希望使用所描述的实用程序类here)
当你使用像HashMap,HashSet这样的散列数据结构时会调用hashCode()
您必须在每个中覆盖hashCode() 覆盖equals()的类。失败 这样做会导致违反 一般合同 Object.hashCode(),它会阻止 你的班级正常运作 结合所有基于哈希的 集合,包括HashMap, HashSet和Hashtable。
来自 Effective Java 的,来自Joshua Bloch
另见
答案 2 :(得分:0)
覆盖 hashCode()
时,您需要覆盖equals()
。仅使用equals()
并不足以要求您覆盖hashCode()
。
答案 3 :(得分:0)
即使无法覆盖hashCode()
只会破坏HashSet
,HashMap
和其他hashCode相关结构中您的类的使用,您仍应覆盖hashCode()
以维护Object
描述的合同。
大多数hashCode()
实现的一般策略是组合用于确定相等性的字段的哈希码。在您的情况下,合理的hashCode()
可能看起来像这样:
public int hashCode(){
return this.getName().hashCode() ^ this.getId() ^ this.getPassword().hashCode();
}
答案 4 :(得分:-1)
hashCode()
的想法是它是给定空间中对象的唯一表示。保存对象的数据结构使用哈希码来确定放置对象的位置。在Java中,例如HashSet
使用对象的哈希码来确定对象所在的桶,然后对于该桶中的所有对象,它使用equals()
确定它是否匹配。
如果你没有覆盖hashCode()
,但覆盖equals()
,那么你将会认为2个对象相等,但Java集合不要以同样的方式看待它。这将导致很多奇怪的行为。