我重写了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对于每个对象都是唯一的(我想),我希望结果是:"它们是不同的对象!"。 问:为什么?
答案 0 :(得分:4)
equals
的默认Object
实施使用实例的参考地址。如果两个Objects
位于内存中的相同位置,则它们是相等的。
如果您不重写equals
,那就是您获得的实施方案。
此外,此行为与hashCode
无关,因为您没有调用hashCode
。如果您直接致电equals
,则不会使用hashCode
。 hashCode
通常用于数据结构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
因为它们是不同的对象。