这是一个实现细节,因此真正的定义在源代码中,例如这些注释应该会解释其中的一些细节。 对于32位VM,默认的hashCode有25位(不知道你从哪里得到了23),而64位VM有31位。 我猜你所说的无锁状态是指偏向锁,但两者不能同时存在,因为标记工作区没有足够的空间容纳两者。 有用性是相同的(不管你指的是什么),只是由于位数较少,预计碰撞更多。
System.identityHashCode(…)
保证对于同一对象始终返回相同的值,因此一旦使用过,该值必须为对象记住。人们经常认为这个标识哈希码是一个内存地址,但HotSpot JVM具有分代垃圾收集器,可能会移动堆内存中的对象。此外,在本地分配缓冲区中内存地址的可预测性使得地址成为糟糕的哈希码(就HashMap
效率而言)。因此,有不同的可能算法来生成它,但结果必须存储在对象头中。 - Holger