【发布时间】:2010-11-06 23:27:35
【问题描述】:
Object.hashCode() 的默认实现通常是对象在内存中的分配地址的某些函数(尽管 JLS 没有强制要求)。鉴于 VM 在内存中分流对象,为什么 System.identityHashCode() 返回的值在对象的生命周期内从不改变?
如果是“一次性”计算(对象的hashCode 计算一次并隐藏在对象标题或其他东西中),那么这是否意味着两个对象有可能具有相同的identityHashCode(如果它们恰好首先分配在内存中的相同地址)?
【问题讨论】:
-
相关问题:该内存地址是真实的内存地址还是虚拟的东西,即使对象被洗牌也可以保持固定?如果是虚拟的,那就太好了,因为不需要调整指向它的指针。另一方面,这意味着额外的间接性和潜在的大映射表。
-
第一次请求时,地址略有重新排列。 (返回低位全为零的哈希码并不好。)
-
其实哪里说identityHashCode不能改变? System.identityHashCode 的 JavaDoc 对此并不清楚。
-
当然,如果 identityHashCode 确实发生了变化,你只能使用实现 hashCode() 的对象作为哈希表中的键。
-
好的,明白了:“在 Java 应用程序的执行过程中,只要在同一个对象上多次调用 (hashCode),hashCode 方法必须始终返回相同的整数,前提是没有使用修改了对象上的等于比较。”在这种情况下,equals 是对象身份比较。
标签: java jvm hashcode heap-memory