[英]Overriding hashCode() and equals() methods
我同时覆盖了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; }
我创建了两个相同的对象:
PC One = new PC(); One.setModel("HP"); One.setYear(2013); PC Two = new PC(); Two.setModel("HP"); Two.setYear(2013);
我比较了这两个对象:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.