Hashcode平等是否意味着引用基于参考的平等?

时间:2011-04-28 18:01:50

标签: java object methods override

我读到在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()方法?

5 个答案:

答案 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()只会破坏HashSetHashMap和其他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集合不要以同样的方式看待它。这将导致很多奇怪的行为。