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

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

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

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

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

从文档 :

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

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

你用哈希码做什么都不应该关心这一点。 您应该从哈希码中推断出的唯一内容是:

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

你的答案就在这里 。 如文档中所述:

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

您可能对System.identityHashCode(Object)感兴趣