5

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

4

3 回答 3

7

答案是不。

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

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

而对于Object.hashCode()

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

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

于 2012-05-18T01:22:48.117 回答
5

最简洁的答案是不。

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

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

那么让我们检查...的 文档Object.hashCode()

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

于 2012-05-18T01:20:57.450 回答
1

你的问题只有两点:

  1. 返回什么System.identityHashCode(Object)

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

  2. 比较两个对象的相等性时,哈希码规则是什么。

    合同说,如果两个对象使用 equals(object) 方法相等,那么它们应该具有相同的哈希码,但如果两个对象具有相同的哈希码,它们不一定相等。

于 2012-05-18T01:31:14.297 回答