如果两个对象的System.identityHashCode相同,我能否假设它们是相同的?

6

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


4
为什么不用 == 来比较它们,它确实表示它们是相同的。 - Greg Kopff
如果你喜欢编写不可移植的代码,那么答案是“是” :) - Sergey Kalinichenko
我不会基于方法的内部实现来构建应用程序逻辑,特别是考虑到Object.hashcode的出色Javadoc。 - Perception
3个回答

8
答案是否定的。 System.identityHashCode()只是返回Object.hashCode()

对于给定对象,只要该对象的类没有覆盖hashCode()方法,就会返回与默认方法hashCode()返回的相同的哈希码。空引用的哈希码为零。

而对于Object.hashCode()

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

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

6
短答案是否定的。
根据文档System.identityHashCode(Object) ...

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

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

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


1

你的问题只有两个方面:

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接