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

if two objects hashcode is a same, why doesnot mean that 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() 为真。我知道,如果两个对象相等,那么这两个对象应该 return 相同的哈希码。如果两个对象的哈希码相同,为什么不表示 o1.equals(o2)?

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

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

hash函数(线索在名称中)的目的是return值在不同对象的范围内均匀分布。不要 return 每个对象的不同值。

这意味着散列函数通常会发生冲突。虽然理想情况下它们的数量应该尽可能少。

想象如下的哈希算法(不一定是好的算法)。

  1. 取最后 4 位数字给我们指定的 ID。

  2. 假设有两个 ID 12341234 和 67281234。

hashCodes 是相同的,但 id 和它们标识的内容可能不同。

有点像:

If John and James are twins, then they must belong to the same mother

哪个(我相信你同意)不是意味着

If John and James belong to the same mother, then they must be twins

其中 "having the same mother" 具有相同的哈希码,而 "being twins" 相等。

剩下的,我建议你通读这个问题的第一个答案What is the use of hashCode in Java?