equals和hashCode都是在java.lang.Object
类定义的方法,equals用于比较当前对象和另外一个对象是否相等,而hashCode用于返回当前对象的哈希码,主要用于快速查找对象在基于哈希表集合中的存储位置。
equals方法在Object类中的默认实现是对比当前对象和另外一个对象的地址是否相等。
public boolean equals(Object obj) {
return (this == obj);
}
在实际开发中,某些JavaBean对象,我们希望他们某些属性相同就视为相等,这种情况我们一般会重写equals方法,比如
在实现equals方法时有一些约定俗成的规则,遵守这些规则能够使得代码避免出现一些不必要问题。
x.equals(x)
应该返回true。x.equals(y)
返回true,那么y.equals(x)
也应该返回true。x.equals(y)
返回true且y.equals(z)
返回true,那么x.equals(z)
也应该返回true。x.equals(y)
返回true,且x和y对象未发生改变,那么x.equals(y)
返回true应该一直成立。hashCode用于返回当前对象的哈希码,这个哈希码可以用于快速查找对象在基于哈希表集合中的存储位置,当我们重写equals方法时,一般也会重写hashCode方法来保证equals和hashCode的一致性,这样也是为了避免出现一些不必要的问题,在重写hashCode方法时需要注意
总结就是两个对象equals返回true,hashCode应该相等,而hashCode相等,equals不一定返回true。
如果我们重写了equals方法,但是没有重写hashCode方法,会出现什么问题,看看下面这个例子。
明明是两个相等的key,但是我们从HashMap中取的值却不相同,这样就会导致一些逻辑很奇怪,所以我们在重写equals方法之后也重写hashCode,并且保证两者不会出现矛盾。