Java Object.hashCode() - 地址还是随机()?

时间:2013-04-19 13:10:05

标签: java

我正在尝试理解hashCode()方法的原生实现。这种方法到底是什么回归?它是一个内存地址还是一个随机值?

3 个答案:

答案 0 :(得分:37)

.hashCode()本机实现依赖于JVM。

E.g。 HotSpot有6个Object.hashCode()实现。您可以使用-XX:hashCode=n标志通过命令行运行JVM来选择它,其中n:

  

0 - Park-Miller RNG(默认)
   1 - f(地址,global_statement)
   2 - 常数1
   3 - 串行计数器
   4 - 对象地址
   5 - 线程局部Xorshift

答案 1 :(得分:22)

来自the documentation

  

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

所以它可能与内存地址有关,但它不一定是 - 你绝对不应该假设它与内存有关。

你对哈希码所做的任何事都不应该关心这一点。您应该从哈希码推断的事项是:

  • 如果两个对象的哈希码相同,则可能是相等的对象
  • 如果两个对象的哈希码不同,则它们不是相等的对象(假设一个正确的实现,无论是否被覆盖)

答案 2 :(得分:3)

你的答案是here。如文档中所述:

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