在Java中,equals
和hashCode
是两个密切相关的方法,它们都在Object
类中定义。equals
方法用于比较两个对象是否相等,而hashCode
方法返回一个对象的哈希码,这个哈希码在哈希表(如HashMap
、HashSet
等)中起着关键作用。
为什么重写equals
就一定要重写hashCode
?
-
一致性要求:
- 根据Java的规范,如果两个对象通过
equals
方法比较是相等的,那么它们的hashCode
值也必须相同。这是因为哈希表依赖于哈希码来确定对象的存储位置。如果两个相等的对象具有不同的哈希码,哈希表将无法正确地工作。
- 根据Java的规范,如果两个对象通过
-
哈希表的正确性:
- 在哈希表中,对象的存储和检索依赖于它们的哈希码。如果重写了
equals
方法但没有重写hashCode
方法,可能会导致两个逻辑上相等的对象具有不同的哈希码,从而导致哈希表无法正确地存储和检索这些对象。
- 在哈希表中,对象的存储和检索依赖于它们的哈希码。如果重写了
-
避免逻辑错误:
- 如果不重写
hashCode
方法,可能会导致逻辑错误。例如,在HashSet
中添加一个对象,然后添加一个逻辑上相等的对象,由于它们的哈希码不同,可能会被视为两个不同的对象,从而导致集合中包含重复的元素。
- 如果不重写
示例
假设我们有一个Person
类,我们重写了<