尽管两个不同的对象可能具有相同的哈希码,但是System.identityHashCode()
似乎返回了对象的内存指针。我想在32位JVM实现中没有例外,包括Sun JDK,Open JDK。但是,我没有检查源代码。在实践中,我可以假设具有相同System.identityHashCode()
的两个对象是相同的吗?
答案 0 :(得分:6)
答案是否定的。
System.identityHashCode()只需返回Object.hashCode()。
返回与返回的给定对象相同的哈希码 通过默认方法hashCode(),无论给定对象的是否 class重写hashCode()。空引用的哈希码是 零。
适用于Object.hashCode()
尽可能合理实用,由hashCode方法定义 class Object确实为不同的对象返回不同的整数。 (这个 通常通过转换内部地址来实现 将对象转换为整数,但这种实现技术不是 JavaTM编程语言所要求的。)
但是,Sun JDK中有bug表示两个对象可以返回相同的哈希码。
答案 1 :(得分:3)
简短的回答是否定的。
根据documentation,System.identityHashCode(Object)
...
返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。
然后让我们检查Object.hashCode()
的{{3}} ...
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但 Java编程语言不需要此实现技术。)
答案 2 :(得分:1)
你的问题只有两件事
首先,System.identityHashCode(Object)返回什么。
返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。空引用的哈希码为零。
第二,比较两个对象的相等性时的哈希码规则是什么。
契约说,如果两个对象使用equals(object)方法相等,那么它们应该具有相同的哈希码,但如果两个对象具有相同的哈希码,则它们不一定相等。