equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等。
默认情况下,Java中的 equals 方法比较的是对象的引用。如果我们不重写 equals 方法,那么对于两个不同的对象,即使它们的内容相同,调用 equals 方法也会返回 false,因为它们的引用不同。
例如:
public class Demo02 {
public static void main(String[] args) {
Cat cat1 = new Cat(18,"张三");
Cat cat2 = new Cat(18,"张三");
System.out.println(cat1.equals(cat2));
}
}
这与我们平常使用的并不相符合,因此需要重写equals。
重写 equals
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cat cat = (Cat) o;
return age == cat.age &&
Objects.equals(name, cat.name);
}
不重写时,就算引用的对象相同,他们之间的hashcode的值也不相同,这样就会发生一件奇怪的事情。
众所周知,hashset中不可以存在相同的<key,value> 但是不重写hashcode会发生下面这件事:
为什么不一样呢?由于两个对象的物理地址(在内存中的位置)不同,会根据hash函数得出来的hashcode也不相同,故hashset并未将二者当成一个。但这种情况在我们现实中是不利的,所以需要重写。
重写:
@Override
public int hashCode() {
return Objects.hash(name, age);
}
根据上述两种情况我们可以得知,重写equals时也尽量把hashcode也重写了,避免不必要的麻烦。若当equals比较相同时,但hashcode比较不相同,则会出现明明二者equals相同,但在hashset中依然会出现重复。为了避免这种情况的发生,我们在重写完equals时也要把hashcode给重写了!!!