1

我知道 hashmap 键应该是不可变的对象,或者至少有一个一致的哈希码来正确地从 Map/Set 中检索它的值。但是,如果我使用变异对象作为键而不覆盖哈希码或等于,那么它的哈希码是否会与它的生命周期一致。我已经尝试用它来检索变异对象的哈希码,并发现它始终是一致的。

4

4 回答 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 上查看这个线程:

JVM 如何确保 System.identityHashCode() 永远不会改变?

于 2012-08-04T08:58:44.650 回答
0

默认的 Java 实现hashcode是基于指向对象的指针,所以当实例变量改变时它不应该改变。

编辑

但 Martijn 打败了我。

于 2012-08-04T09:00:48.893 回答