重写 equals() 方法时必须重写 hashCode() 方法
equals() 比较过程:
- 第一步,先判断引用值是否相等,此时person1.equals(person1)这样的情况,就可以很快返回结果true。
- 第二步,判断类型是否匹配,如果两个对象等价,前提是它们一定为相同的类型,此时person1.equals(null)这样的情况,也能进行判断并返回结果false。
- 第三步,按部就班地按照预设的特征值进行对象的等价性判断。
*[注]:
- 类中的
equals方法是一定要重写/覆盖(Override)的,因为要让它按照设计的需求来根据特征值判断等价性。例如String类型的name属性,表示每个Person对象的名字。由于在equals方法中只设定了这一个需要比较的特征值,因此只要两个Person类对象的name相同,那么他们的判断结果就是相同。 - 类中的
hashCode方法需要重写/覆盖 事实上,当实现了1之后,就能保证判断两个对象等价性是否成立了(此时已经使得person1.equals(person2)值为true。但是这样得到的equals方法是有很大限定性的。比如把person1加入到一个HashSet中,此时判断HashSet中是否包含person2,由于在设计时,特征值只是name,那么此时期望HashSet.contains(person2)的值也应为true,但如果不实现hashCode方法,返回值只能是false。