24

我试图了解该hashCode()方法的本机实现。这个方法到底返回了什么?它是内存地址还是随机值?

4

3 回答 3

40

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

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

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

于 2013-04-19T13:33:36.903 回答
22

文档中

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

所以它可能与内存地址有关,但不一定是 - 而且您绝对不应该对它与内存有关的任何假设。

您对哈希码所做的任何事情都不应该关心这一点。您应该从哈希码中推断出的唯一内容是:

  • 如果两个对象的哈希码相同,它们可能是相等的对象
  • 如果两个对象的哈希码不同,则它们不是相等的对象(假设一个正确的实现,无论是否被覆盖)
于 2013-04-19T13:11:27.373 回答
3

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

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

于 2013-04-19T13:13:26.410 回答