繁体   English   中英

重写hashCode()和equals()方法

[英]Overriding hashCode() and equals() methods

  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!"); } 

结果是:“它们是相同的对象!”。 但是,如果我不重写这两种方法,结果将是:“它们是不同的对象!”。 因为hashCode对于每个对象都是唯一的(我想),所以我期望结果是:“它们是不同的对象!”。 问:为什么?

Object的默认equals实现使用实例的引用地址。 仅当两个Objects位于内存中的相同位置时,它们才相等。

如果您不重写equals ,那么您将获得实现。

另外,此行为与hashCode无关,因为您没有调用hashCode 如果直接调用equals ,则不会使用hashCode hashCode通常与HashMap一样在数据结构中使用。

@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方法的默认实现的此方法不正确。 默认情况下,等于等于通过==等于运算符进行比较,该运算符将32位或64位指针引用与JVM内存位置进行比较。 检查此链接

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

当您不重写equals ,您的PC对象将从Object继承equals方法 ,该方法执行与==相同的操作-比较对象引用以查看它们是否是同一对象。

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

因此,在比较PC对象的内部内容之后, equals方法返回true ,但是当未覆盖时, Objectequals方法返回false因为它们是不同的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM