[英]Under what Conditions two different objects may have same hashcode() value..?
我所知道的是: -
“ int hashCode()
返回对象的内存地址作为对象的默认哈希值。”
如果引用x
和y
表示两个不同的对象,则表达式(x.hashCode() == y.hashCode())
并不总是false
所以,我想询问在哪些情况下,2个不同对象的哈希值是相同的。
您可以在类中重写hashCode
。 您通常会覆盖它以及重写的equals
,因此如果a.equals(b)
为真,则a.hashCode() == b.hashCode()
也为真(即使(a == b)
为false)。
但是,即使a.equals(b)
为false, a.hashCode() == b.hashCode()
仍可能为真。
正如您在Javadoc of Object类中看到的:
- 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
- 根据java.lang.Object.equals(java.lang.Object)方法,如果两个对象不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果 。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
HashCode并不总是返回内存地址(由于对象可能在内存中重定位,因此本身可能是伪造的)。 提供自己的hashCode
可能有一个导致冲突的算法(两个不同的对象具有相同的hashCode)。
另外,你可以获得所涉及的equals
:两个对象,其中a!=b
但a.equals(b)
为真, 必须具有相同的hashCode或某些数据结构,如hashmaps,hashsets,LRU caches等,将无法正常工作。 但是,如果两个不相等的对象具有相同的hashCode,则不会产生任何问题 - 在许多情况下, hashCode
用作提高性能的提示(例如,在hashMap中)。 虽然糟糕的hashCode实现如return 1;
不会导致正确编写的数据结构失败,它们会导致性能下降(例如,在HashMap的情况下,分摊的O(1)变为O(N))。
第三,如果该类的对象超过4,294,967,296个,那么即使最好的hashCode也必然会发生冲突。 这是因为只有4,294,967,296个distict hashCode值,因为hashCode是一个int,而且是pigeonhole原则。
Object#hashCode()
和所有重写实现的契约:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
根据java.lang.Object.equals(java.lang.Object)方法,如果两个对象不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
hashCode
的“返回内存地址”实现是默认的 。 几乎总是,当你在HashMap或HashSet中使用一种类型的对象或者你有什么用时,你将用你自己的实现覆盖 hashCode
,这可能与对象的内存地址没有任何关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.