如果两个对象的哈希码相同,为什么不等于o1.equals(o2)? [重复]

问题描述 投票:0回答:4

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

  1. 如果为o1.equals(o2),则o1.hashCode() == o2.hashCode()应始终为true。
  2. [如果o1.hashCode() == o2.hashCode()为真,并不表示o1.equals(o2)为真。

如果o1.hashCode() == o2.hashCode()为true。我知道,如果两个对象相等,则这两个对象应返回相同的哈希码。如果两个对象的哈希码相同,为什么不表示o1.equals(o2)

java equals hashcode
4个回答
4
投票

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

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


0
投票

如下所示,为哈希算法(不一定是好的算法)。

  1. 将最后4位数字作为我们分配的ID。

  2. 想象两个ID分别为12341234和67281234。

hashCodes是相同的,但是id以及因此它们标识的可能不同。


0
投票

有点像:

如果约翰和詹姆斯是双胞胎,那么他们必须属于同一个母亲

哪个(我确定你同意)是否不是意味着

如果约翰和詹姆斯属于同一个母亲,那么他们一定是双胞胎

[“有同一个母亲”具有相同的哈希码,而“成为双胞胎”则相等。

其余,我建议您通读此问题的第一个答案What is the use of hashCode in Java?


0
投票

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

这意味着哈希函数通常会发生冲突。尽管理想情况下,它们的数量应尽可能小。

© www.soinside.com 2019 - 2024. All rights reserved.