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

时间:2012-05-18 01:07:55

标签: java hash-code-uniqueness

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

3 个答案:

答案 0 :(得分:6)

答案是否定的。

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

  

返回与返回的给定对象相同的哈希码   通过默认方法hashCode(),无论给定对象的是否   class重写hashCode()。空引用的哈希码是   零。

适用于Object.hashCode()

  

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

但是,Sun JDK中有bug表示两个对象可以返回相同的哈希码。

答案 1 :(得分:3)

简短的回答是否定的。

根据documentationSystem.identityHashCode(Object) ...

  

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

然后让我们检查Object.hashCode()的{​​{3}} ...

  

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

答案 2 :(得分:1)

你的问题只有两件事

首先,System.identityHashCode(Object)返回什么。

  

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

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

  

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