java - 如果两个对象的哈希码相同,为什么不意味着 o1.equals(o2)?
问题描述
实施equals()
并hashCode()
应遵循这些规则。
- 如果
o1.equals(o2)
,o1.hashCode() == o2.hashCode()
则应始终为真。 - 如果
o1.hashCode() == o2.hashCode()
是真的,那并不意味着那o1.equals(o2)
将是真的。
如果o1.hashCode() == o2.hashCode()
是真的。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希码。如果两个对象的哈希码相同,为什么不意味着o1.equals(o2)
?
解决方案
考虑Long
。这种类型有 2^64 个可能的值。hashCode
返回一个int
,它只有 2^32 个可能的值。
对于身份哈希码(可从 获取System.identityHashCode
),对象在许多现代 JVM 实现的内存中移动。没有合理的方法来跟踪哪些哈希码仍在使用中。即使使用(线程安全)计数器,在 2^32 分配之后也需要某种重用。
推荐阅读
- nrules - 有没有人有动态 NRules 的工作示例?
- java - 当我尝试实例化 JobOperator 时,抛出了 ClassNotFoundException。(org.apache.commons.dbcp2.BasicDataSource)
- php - 将文档保存为 pdf 时删除了 phpoffice 换行符
- sockets - 来自 setsockopt 的 ENODEV 错误的原因是什么
- javascript - useEffect() 由于某种原因无限运行
- google-sheets - 在范围部分使用通配符的 VLOOKUP 样式查询
- python - 使用 ctypes 创建用于包装结构的数据类型
- google-maps - 谷歌地图自动完成 - 街道号码消失
- javascript - 在 React 中条件渲染和包装两个或多个具有相同类型的元素
- symfony - PhpStorm Symfony 路由丢失