在Java中,当你重写一个类的equals()方法时,通常也需要重写hashCode()方法。这是因为equals()方法和hashCode()方法在哈希集合(如HashMap、HashSet)和哈希映射(如HashMap)中密切相关。
哈希集合和哈希映射使用哈希值来快速定位和比较对象。hashCode()方法返回对象的哈希码,而equals()方法用于比较对象的相等性。在哈希集合和哈希映射中,如果两个对象被equals()方法判断为相等,那么它们的哈希码也必须相等。
如果你只重写了equals()方法而没有重写hashCode()方法,可能会导致以下问题:
不一致的行为: 如果两个对象在equals()方法中被判断为相等,但它们的哈希码却不相等,那么在哈希集合或哈希映射中,它们将被视为不同的对象。这可能导致无法正确访问或删除预期中的对象。
无法正确存储: 在哈希集合或哈希映射中,对象的哈希码用于确定存储位置。如果两个相等的对象具有不同的哈希码,它们可能会被错误地存储在不同的位置,导致无法正确检索或更新数据。
因此,为了保持一致的行为和正确的数据存储,当你重写equals()方法时,必须同时重写hashCode()方法,以确保相等的对象具有相等的哈希码。常见的做法是,在hashCode()方法中使用与equals()方法中使用的字段相同的字段来计算哈希码,以保持一致性。
注意:根据Java规范,如果两个对象通过equals()方法判断为相等,它们的哈希码必须相等;但是,两个哈希码相等的对象不一定通过equals()方法判断为相等。因此,哈希码的计算应该尽可能分散,以减少哈希冲突的可能性。