重写 `equals()` 方法时必须重写 `hashCode()` 方法

48 阅读1分钟

重写 equals() 方法时必须重写 hashCode() 方法

equals() 比较过程:

  • 第一步,先判断引用值是否相等,此时person1.equals(person1)这样的情况,就可以很快返回结果true。
  • 第二步,判断类型是否匹配,如果两个对象等价,前提是它们一定为相同的类型,此时person1.equals(null)这样的情况,也能进行判断并返回结果false。
  • 第三步,按部就班地按照预设的特征值进行对象的等价性判断。

*[注]:

  1. 类中的equals方法是一定要重写/覆盖(Override)的,因为要让它按照设计的需求来根据特征值判断等价性。例如String类型的name属性,表示每个Person对象的名字。由于在equals方法中只设定了这一个需要比较的特征值,因此只要两个Person类对象的name相同,那么他们的判断结果就是相同。
  2. 类中的hashCode方法需要重写/覆盖 事实上,当实现了1之后,就能保证判断两个对象等价性是否成立了(此时已经使得person1.equals(person2)值为true。但是这样得到的equals方法是有很大限定性的。比如把person1加入到一个HashSet中,此时判断HashSet中是否包含person2,由于在设计时,特征值只是name,那么此时期望HashSet.contains(person2)的值也应为true,但如果不实现hashCode方法,返回值只能是false