equals和hashCode

深入学习Java基础知识
2021-05-17 14:29 · 阅读时长6分钟
小课

equals和hashCode都是在java.lang.Object类定义的方法,equals用于比较当前对象和另外一个对象是否相等,而hashCode用于返回当前对象的哈希码,主要用于快速查找对象在基于哈希表集合中的存储位置。

一、equals介绍

equals方法在Object类中的默认实现是对比当前对象和另外一个对象的地址是否相等。

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

在实际开发中,某些JavaBean对象,我们希望他们某些属性相同就视为相等,这种情况我们一般会重写equals方法,比如

加载中...

在实现equals方法时有一些约定俗成的规则,遵守这些规则能够使得代码避免出现一些不必要问题。

  • 自反性(reflexive),任何对象应该equals它自身,比如x.equals(x)应该返回true。
  • 对称性(symmetric),如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
  • 传递性(transitive),如果x.equals(y)返回true且y.equals(z)返回true,那么x.equals(z)也应该返回true。
  • 一致性(consistent),如果x.equals(y)返回true,且x和y对象未发生改变,那么x.equals(y)返回true应该一直成立。
二、hashCode介绍

hashCode用于返回当前对象的哈希码,这个哈希码可以用于快速查找对象在基于哈希表集合中的存储位置,当我们重写equals方法时,一般也会重写hashCode方法来保证equals和hashCode的一致性,这样也是为了避免出现一些不必要的问题,在重写hashCode方法时需要注意

  • 如果两个对象相等,即equals方法返回true,那么它们的hashCode方法返回值应该相等。
  • 但是如果两个对象不相等,即equals方法返回false,它们的hashCode方法返回值仍然可能相等。

总结就是两个对象equals返回true,hashCode应该相等,而hashCode相等,equals不一定返回true。

如果我们重写了equals方法,但是没有重写hashCode方法,会出现什么问题,看看下面这个例子。

加载中...

明明是两个相等的key,但是我们从HashMap中取的值却不相同,这样就会导致一些逻辑很奇怪,所以我们在重写equals方法之后也重写hashCode,并且保证两者不会出现矛盾。

equalshashcode