JVM 如何确保 System.identityHashCode() 永远不会改变?

2022-08-31 13:43:32

通常,Object.hashCode() 的默认实现是内存中对象的分配地址的某个函数(尽管 JLS 没有强制要求这样做)。既然 VM 在内存中分流对象,为什么 System.identityHashCode() 返回的值在对象的生存期内永远不会更改?

如果它是一个“一次性”计算(对象被计算一次并存储在对象标头或其他内容中),那么这是否意味着两个对象可能具有相同的(如果它们碰巧首先被分配在内存中的同一地址)?hashCodeidentityHashCode


答案 1

现代 JVM 将值保存在对象标头中。我相信该值通常仅在首次使用时计算,以便将对象分配时间保持在最低限度(有时低至十几个周期)。可以编译通用的 Sun JVM,以便所有对象的身份哈希代码始终为 1。

多个对象可以具有相同的标识哈希代码。这就是哈希代码的本质。


答案 2

在回答第二个问题时,无论实现如何,多个对象都有可能具有相同的标识HashCode。

有关 javadoc 中措辞的简短讨论,以及用于演示非唯一性的程序,请参阅 bug 6321873