equals()
和hashCode()
的实现应遵循这些规则。
o1.equals(o2)
,则o1.hashCode() == o2.hashCode()
应始终为true。o1.hashCode() == o2.hashCode()
为真,并不表示o1.equals(o2)
为真。如果o1.hashCode() == o2.hashCode()
为true。我知道,如果两个对象相等,则这两个对象应返回相同的哈希码。如果两个对象的哈希码相同,为什么不表示o1.equals(o2)
?
考虑Long
。此类型可能有2 ^ 64个值。 hashCode
返回一个int
,它只有2 ^ 32个可能的值。
对于身份哈希码(可从System.identityHashCode
获得),对象在许多现代JVM实现中在内存中移动。没有合理的方法来跟踪仍在使用哪些哈希码。即使使用(线程安全的)计数器,在2 ^ 32分配之后,也将需要某种重用。
如下所示,为哈希算法(不一定是好的算法)。
将最后4位数字作为我们分配的ID。
想象两个ID分别为12341234和67281234。
hashCodes是相同的,但是id以及因此它们标识的可能不同。
有点像:
如果约翰和詹姆斯是双胞胎,那么他们必须属于同一个母亲
哪个(我确定你同意)是否不是意味着
如果约翰和詹姆斯属于同一个母亲,那么他们一定是双胞胎
[“有同一个母亲”具有相同的哈希码,而“成为双胞胎”则相等。
其余,我建议您通读此问题的第一个答案What is the use of hashCode in Java?
hash函数的目的(线索在名字中)是返回在不同对象的范围内均匀分布的值。不要为每个对象返回不同的值。
这意味着哈希函数通常会发生冲突。尽管理想情况下,它们的数量应尽可能小。