Java对象头中的哈希码(hashcode)有什么作用?

3

当锁处于无锁状态时,对象头部有25个位用于标识哈希码。我想知道哈希码的作用。


2
你目前已经研究了什么?有哪些具体的部分不清楚? - Boris van Katwijk
2
我认为人们完全误解了这个问题。OP询问的是Java对象头,而不是语言定义的一部分,而是HotSpot架构的一部分,因此不是在询问hashcode的一般用途,而是为什么它被用于对象头。 - RealSkeptic
我同意RealSkeptic的观点,因此我添加了一个标签,使问题与HotSpot架构相关,因为单独的“java”标签只适用于一般的Java语言问题。 - DodgyCodeException
4
System.identityHashCode(…)保证对于同一对象始终返回相同的值,因此一旦使用过,该值必须为对象记住。人们经常认为这个标识哈希码是一个内存地址,但HotSpot JVM具有分代垃圾收集器,可能会移动堆内存中的对象。此外,在本地分配缓冲区中内存地址的可预测性使得地址成为糟糕的哈希码(就HashMap效率而言)。因此,有不同的可能算法来生成它,但结果必须存储在对象头中。 - Holger
太棒了!我提出了错误的问题,但是你修正了它并给出了正确的答案。我已经理解了,谢谢大家。 - dabaicai
1个回答

1

这是一个实现细节,因此真正的定义在源代码中,例如这些注释应该会解释其中的一些细节。

对于32位VM,默认的hashCode有25位(不知道你从哪里得到了23),而64位VM有31位。

我猜你所说的无锁状态是指偏向锁,但两者不能同时存在,因为标记工作区没有足够的空间容纳两者。

有用性是相同的(不管你指的是什么),只是由于位数较少,预计碰撞更多。


是的,你说得对。我已经更正了问题描述。谢谢。 - dabaicai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接