java - 重写 HashCode,什么时候这样做不会有问题?

标签 java object hashcode equality

<分区>

重写对象的等号运算符来比较字段时,也说你应该重写hashCode()。

两个对象是否具有所有相同的字段,但 hashCodes() 不同?为什么需要更新两者?

最佳答案

覆盖两者的主要问题是很多容器假定这两种方法使用相同的策略。

典型情况是 HashMap,如果您重写 equals()/hashCode() 中的一个而不是两者(或不一致地重写它们),它们可能无法工作,因为它们使用 hashCode() 来查找您的 key 应该使用的存储桶是,然后使用 equals() 在该桶内搜索。所以它可能最终会在错误的桶中搜索给定的键!。顺便说一下,这就是为什么有时在 get() 时找不到键,但可以通过遍历每个元素找到它:迭代不使用 hadhCode()。

这与为什么当对象在 HashSet/HashMap 中时您不应该永远 hashCode() 更改其值的原因类似:当您搜索对象时,hashCode( ) 可能已更改并将您发送到不正确的存储桶。

关于java - 重写 HashCode,什么时候这样做不会有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308204/

相关文章:

dart - 在 Dart 中覆盖哈希码的好方法是什么?

java - Apache ActiveMQ 回退机制

java - 如何根据另一个 map 键重新排列 map 中的项目

java - 如何将元素放入字符串数组中?

c++ - 在结构定义之前,C++ 类中的结构返回函数

c - 这种散列任何通用对象的方法是否正确?

java - 使用 equalsIgnoreCase 来检查是否相等

Java使用数组将英语转换为Piglatin

javascript - ES6 OOP 从父类继承方法

c# - 创建数据库查询方法