通常默认实现 Object.hashCode() 是内存中对象分配地址的某个函数(尽管这不是由 吉林森)。鉴于虚拟机在内存中分流对象,为什么返回的值 System.identityHashCode() 在对象的生命周期中永远不会改变?

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

有帮助吗?

解决方案

现代JVM保存在对象头中的值。相信值通常只计算在第一次使用,以保持在对象分配花费的最小时间(有时下降到低达一打循环)。共用太阳JVM可被编译,使得标识哈希代码总是1的所有对象。

多个对象可以具有相同身份的散列码。也就是说的散列码的性质。

其他提示

在回答第二个问题,而不管该实现,有可能多个对象具有相同的identityHashCode。

请参阅错误6321873 获得的简要讨论在所述的措辞的Javadoc和程序来演示非唯一性。

HotSpot 中对象的标头由类指针和“标记”字组成。

标记字数据结构的源代码可以找到 markOop.hpp 文件。在这个文件中有一条注释描述了标记字的内存布局:

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

这里我们可以看到,32位系统上普通Java对象的身份哈希码保存在标记字中,长度为25位。

实现哈希函数的一般准则是:

  • 同一个对象应该返回一致的hashCode, ,它不应随时间变化或依赖于任何可变信息(例如由随机数或可变成员字段值播种的算法
  • 哈希函数应该有一个 良好的随机分布, ,我的意思是,如果您将哈希码视为存储桶,则两个对象应尽可能映射到不同的存储桶(哈希码)。两个对象具有相同哈希码的可能性应该很少 - 尽管它 发生。

据我所知,这被实现为返回参考,永远不会在对象寿命而改变。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top