在什么条件下两个不同的对象可能具有相同的 hashcode() 值..?
Under what Conditions two different objects may have same hashcode() value..?
我所知道的是:-
int hashCode()
returns对象的内存地址为
对象的默认哈希值。"
如果引用 x
和 y
表示两个不同的对象,表达式
(x.hashCode() == y.hashCode())
并不总是假的
所以,我想问一下,在哪些情况下,2个不同对象的哈希值是相同的。
hashCode
的 "return memory address" 实现是 默认 。几乎总是,当你在 HashMap 或 HashSet 或你拥有的东西中使用一种类型的对象时,你会 override hashCode
用你自己的实现,这可能与对象的内存地址完全无关。
HashCode 不会总是 return 内存地址(它本身可能是假的,因为对象可能会在内存中重新定位)。提供自己的 hashCode
的 class 可能具有导致冲突的算法(两个不同的对象具有相同的 hashCode)。
此外,还可以涉及到equals
:两个对象,其中a!=b
但a.equals(b)
为真,必须具有相同的hashCode或者某些数据结构,如 hashmaps、hashsets、LRU 缓存等,将无法正常工作。
然而,如果两个不相等的对象具有相同的 hashCode,这不会造成问题——hashCode
在许多情况下用作性能改进的提示(例如在 hashMap 中)。虽然 return 1;
等糟糕的 hashCode 实现不会导致正确编写的数据结构失败,但它们会导致性能下降(例如,在 HashMap 的情况下,摊销的 O(1) 变为 O(N))。
第三,即使是最好的hashCode,如果有超过4,294,967,296个不同的对象class,也必然会发生冲突。这是因为只有 4,294,967,296 个可能的 distict hashCode 值,因为 hashCode 是一个 int,并且根据鸽巢原理。
Object#hashCode()
的合同和所有覆盖实施:
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
您可以在 class 中覆盖 hashCode
。您通常会在覆盖 equals
的同时覆盖它,因此如果 a.equals(b)
为真,则 a.hashCode() == b.hashCode()
也为真(即使 (a == b)
为假)。
然而,即使 a.equals(b)
为假,a.hashCode() == b.hashCode()
也可能仍然为真。
正如您在对象 class 的 Javadoc 中看到的那样:
- If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must
produce the same integer result.
- It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the
hashCode method on each of the two objects must produce distinct
integer results. However, the programmer should be aware that
producing distinct integer results for unequal objects may improve the
performance of hashtables.
我所知道的是:-
int hashCode()
returns对象的内存地址为
对象的默认哈希值。"
如果引用 x
和 y
表示两个不同的对象,表达式
(x.hashCode() == y.hashCode())
并不总是假的
所以,我想问一下,在哪些情况下,2个不同对象的哈希值是相同的。
hashCode
的 "return memory address" 实现是 默认 。几乎总是,当你在 HashMap 或 HashSet 或你拥有的东西中使用一种类型的对象时,你会 override hashCode
用你自己的实现,这可能与对象的内存地址完全无关。
HashCode 不会总是 return 内存地址(它本身可能是假的,因为对象可能会在内存中重新定位)。提供自己的 hashCode
的 class 可能具有导致冲突的算法(两个不同的对象具有相同的 hashCode)。
此外,还可以涉及到equals
:两个对象,其中a!=b
但a.equals(b)
为真,必须具有相同的hashCode或者某些数据结构,如 hashmaps、hashsets、LRU 缓存等,将无法正常工作。
然而,如果两个不相等的对象具有相同的 hashCode,这不会造成问题——hashCode
在许多情况下用作性能改进的提示(例如在 hashMap 中)。虽然 return 1;
等糟糕的 hashCode 实现不会导致正确编写的数据结构失败,但它们会导致性能下降(例如,在 HashMap 的情况下,摊销的 O(1) 变为 O(N))。
第三,即使是最好的hashCode,如果有超过4,294,967,296个不同的对象class,也必然会发生冲突。这是因为只有 4,294,967,296 个可能的 distict hashCode 值,因为 hashCode 是一个 int,并且根据鸽巢原理。
Object#hashCode()
的合同和所有覆盖实施:
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
您可以在 class 中覆盖 hashCode
。您通常会在覆盖 equals
的同时覆盖它,因此如果 a.equals(b)
为真,则 a.hashCode() == b.hashCode()
也为真(即使 (a == b)
为假)。
然而,即使 a.equals(b)
为假,a.hashCode() == b.hashCode()
也可能仍然为真。
正如您在对象 class 的 Javadoc 中看到的那样:
- If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
- It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.