如果两个对象的哈希码相同,为什么不意味着 o1.equals(o2)?

Rez*_*dze -1 java equals hashcode

执行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)

Tom*_*ine 6

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

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