2012-05-18 78 views
4

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

+4

为什么不用'=='来比较它们,而不是*表示它们是相同的。 –

+0

如果你喜欢编写不可移植的代码,答案是“是”:) – dasblinkenlight

+0

我不会将应用程序逻辑基于方法的内部实现,尤其是考虑到优秀的Javadoc for Object.hashcode。 – Perception

回答

3

简短的回答是否定的。

按照该documentationSystem.identityHashCode(Object) ...

返回相同的散列码为给定的对象会被默认的方法的hashCode(返回),给定对象的类是否重写hashCode( )。

那么接下来让检查Object.hashCode()documentation ...

尽可能多是合理可行的,由Object类定义的hashCode方法不会返回不同的整数针对不同的对象。 (这一般是通过将该对象的内部地址转换成一个整数来实现的,但不是由在Java编程语言需要这种实现技巧。)

6

答案是否定的。

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

返回相同的散列码为给定的对象会被默认的方法的hashCode(返回 ),给定对象的 类是否重写hashCode()。空引用的哈希码为零。

虽然Object.hashCode()

多达是合理可行,通过 类对象定义的hashCode方法不会返回针对不同的对象不同的整数。 (此 通常通过转换所述 对象的内部地址转换成一个整数来实现的,但是这种实现的技术是不被的JavaTM编程语言不需要 。)

然而,存在孙bug JDK指出两个对象可以返回相同的哈希码。

+1

+1以供参考。 – Jeremy

1

有你的问题

首先,这是什么System.identityHashCode(Object)返回只有两件事情。

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

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

合同说,如果两个对象是相等的使用equals(Object)方法,就应该有相同的hashCode,但如果两个对象具有相同的哈希码,他们不一定相等。

相关问题