首页 > 解决方案 > 如果两个对象的哈希码相同,为什么不意味着 o1.equals(o2)?

问题描述

实施equals()hashCode()应遵循这些规则。

  1. 如果o1.equals(o2)o1.hashCode() == o2.hashCode()则应始终为真。
  2. 如果o1.hashCode() == o2.hashCode()是真的,那并不意味着那o1.equals(o2)将是真的。

如果o1.hashCode() == o2.hashCode()是真的。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希码。如果两个对象的哈希码相同,为什么不意味着o1.equals(o2)

标签: javaequalshashcode

解决方案


考虑Long。这种类型有 2^64 个可能的值。hashCode返回一个int,它只有 2^32 个可能的值。

对于身份哈希码(可从 获取System.identityHashCode),对象在许多现代 JVM 实现的内存中移动。没有合理的方法来跟踪哪些哈希码仍在使用中。即使使用(线程安全)计数器,在 2^32 分配之后也需要某种重用。


推荐阅读