【发布时间】:2013-04-05 08:59:00
【问题描述】:
如果我没记错的话,Java 中 Object() 类型对象的默认 hashCode() 实现是返回对象的内存地址。当我们创建自己的类时,我读到我们想要覆盖 hashCode() 以便当我们将它们插入到像 HashMap() 这样的与哈希相关的集合中时,它会正常工作。但是为什么内存地址不好呢?
当然,我们最终会耗尽内存并且您会遇到冲突,但我认为这是一个问题的唯一情况是您正在处理大量数据并且内存非常少,然后它会开始影响性能,因为 java 中与哈希相关的集合通过链接解决冲突(存储桶将链接到解析为相同哈希码/索引的值列表)。
【问题讨论】:
-
你不是问题所在。你可以开始阅读this。不能独立于平等概念来看待这个问题。
-
它没有什么不好的,它有时需要因其他原因而改变。
-
默认
hashCode()与内存地址无关。文档提到内存地址作为哈希码计算的可能输入,但这不是在任何最近的 JVM 中实现的方式。 -
@Holger 它可能与内存访问有关,有5种策略可供选择;但默认值确实不是基于内存的,至少是 Marsaglia XOR Shift in 8
-
可能在问这个问题之前你应该了解哈希映射的工作原理