覆盖hashCode()和equals()方法

时间:2014-10-07 18:31:59

标签: java override equals hashcode

  1. 我重写了hashCode()和equals(),但是我没有修改被覆盖的方法中的任何内容

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + Objects.hashCode(this.model);
        hash = 67 * hash + this.year;
        return hash;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PC other = (PC) obj;
        if (!Objects.equals(this.model, other.model)) {
            return false;
        }
        if (this.year != other.year) {
            return false;
        }
        return true;
    }
    
  2. 我创建了两个相同的对象:

    PC One = new PC();
    
    One.setModel("HP");
    
    One.setYear(2013);
    
    PC Two = new PC();
    
    Two.setModel("HP");
    
    Two.setYear(2013);
    
  3. 我比较了这两个对象:

     if (One.equals(Two)) {
    
            System.out.println("They are the same objects!");
    
      } else {
    
           System.out.println("They are different objects!");
       }
    
  4. 结果是:"它们是相同的对象!"。但是,如果我不重写这两种方法,结果将是:"它们是不同的对象!"。  因为hashCode对于每个对象都是唯一的(我想),我希望结果是:"它们是不同的对象!"。 问:为什么?

3 个答案:

答案 0 :(得分:4)

equals的默认Object实施使用实例的参考地址。如果两个Objects位于内存中的相同位置,则它们是相等的。

如果您不重写equals,那就是您获得的实施方案。

此外,此行为与hashCode无关,因为您没有调用hashCode。如果您直接致电equals,则不会使用hashCodehashCode通常用于数据结构HashMap

答案 1 :(得分:3)

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final PC other = (PC) obj;
    if (!Objects.equals(this.model, other.model)) {
        return false;
    }
    if (this.year != other.year) {
        return false;
    }
    return true;
}

您声称是equals方法的默认实现的方法不正确。 Equals默认通过==等于运算符进行比较,该运算符将32或64位指针引用与JVM内存位置进行比较。请检查此link

public boolean equals(Object obj) {
       return (this == obj);
}

答案 2 :(得分:1)

当您不覆盖equals时,您的PC对象会继承equals method from Object,其执行与==相同的事情 - 比较对象引用以查看如果它们是同一个物体。

  

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

因此,在比较equals个对象的内部内容后,您的true方法会返回PC,但如果没有覆盖,则Object' s {{1 }}方法返回equals因为它们是不同的对象。