我知道 hashmap 键应该是不可变的对象,或者至少有一个一致的哈希码来正确地从 Map/Set 中检索它的值。但是,如果我使用变异对象作为键而不覆盖哈希码或等于,那么它的哈希码是否会与它的生命周期一致。我已经尝试用它来检索变异对象的哈希码,并发现它始终是一致的。
问问题
1482 次
4 回答
4
国家合同hashcode
:
每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。
所以如果你改变你的对象,不能保证哈希码不会改变。碰巧一些 JDK 实现可能会使用某种内部地址,但它们不是必须的,所以你不应该依赖它。
于 2012-08-04T09:05:46.280 回答
3
在最新版本的 HotSpot JVM 中,对象的默认哈希码不会随时间改变。事实上,哈希码是从初始分配地址派生的,并在对象被垃圾收集器移动时输入到对象头(参见JVM 白皮书)中,之后不会更改。
于 2012-08-04T09:06:54.463 回答
0
是的,如果您不覆盖 hashCode 方法,它将保持不变。默认的 hashCode 是对象在内存中的原始位置。此内存位置通过以下方法检索:
System.identityHashCode(Object)
在 StackOverflow 上查看这个线程:
于 2012-08-04T08:58:44.650 回答
0
默认的 Java 实现hashcode
是基于指向对象的指针,所以当实例变量改变时它不应该改变。
编辑
但 Martijn 打败了我。
于 2012-08-04T09:00:48.893 回答