<分区>
重写对象的等号运算符来比较字段时,也说你应该重写hashCode()。
两个对象是否具有所有相同的字段,但 hashCodes() 不同?为什么需要更新两者?
<分区>
重写对象的等号运算符来比较字段时,也说你应该重写hashCode()。
两个对象是否具有所有相同的字段,但 hashCodes() 不同?为什么需要更新两者?
最佳答案
不覆盖两者的主要问题是很多容器假定这两种方法使用相同的策略。
典型情况是 HashMap,如果您重写 equals()/hashCode() 中的一个而不是两者(或不一致地重写它们),它们可能无法工作,因为它们使用 hashCode() 来查找您的 key 应该使用的存储桶是,然后使用 equals() 在该桶内搜索。所以它可能最终会在错误的桶中搜索给定的键!。顺便说一下,这就是为什么有时在 get() 时找不到键,但可以通过遍历每个元素找到它:迭代不使用 hadhCode()。
这与为什么当对象在 HashSet/HashMap 中时您不应该永远 hashCode() 更改其值的原因类似:当您搜索对象时,hashCode( ) 可能已更改并将您发送到不正确的存储桶。
关于java - 重写 HashCode,什么时候这样做不会有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308204/