我可以假设具有相同System.identityHashCode的两个对象是相同的吗?

Xiè*_*léi 4 java hash-code-uniqueness

虽然两个不同的对象可能具有相同的哈希码,但是,System.identityHashCode()似乎返回对象的内存指针.我想在32位JVM实现中没有例外,包括Sun JDK,Open JDK.但是,我没有检查源代码.在实践中,我可以假设两个具有相同的对象System.identityHashCode()是相同的吗?

Pau*_*Wee 6

答案是不.

System.identityHashCode()只返回Object.hashCode().

返回给定对象的相同哈希码,就像默认方法hashCode()返回的一样,无论给定对象的类是否覆盖hashCode().空引用的哈希码为零.

虽然为 Object.hashCode()

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.)

但是,Sun JDK中存在一个错误,表明两个对象可以返回相同的哈希码.


Jer*_*emy 5

最简洁的答案是不。

根据文档System.identityHashCode(Object)...

为给定对象返回与默认方法 hashCode() 返回的哈希码相同的哈希码,无论给定对象的类是否覆盖 hashCode()。

因此,然后让检查文档Object.hashCode()...

尽可能实用,类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但Java 编程语言不需要这种实现技术。)