java - 为什么值类的值是它的 hashCode "not a good idea"?

标签 java hash hashmap hashcode

Effective Java,第 2 版,J. Bloch第 9 项 的最后一段 表示,对于 IntegerStringDate 等值类, 返回该类的精确值的函数作为 hashCode 不是个好主意

因此,类 Integer 返回它表示的整数的 value 作为其实例的 hashCode 并不是那么好。

hashCode() 也不是String 返回一个直接从整体内容映射的整数值,即 String 实例具有的字符。

这些 hashCode()-s 显然符合契约。

对我来说,这似乎是个好主意而不是坏主意——hashCode-s 随着值在对象之间的变化而变化,这些 hashCode 是在将它们散布到 HashMap/HashSet 的桶中之前“规范化”——这样条目的 hashCode-s 就不会对条目将进入哪个桶形成偏见。

我在这里遗漏了什么 - 是什么让将类值直接映射到 hashCode 成为“坏主意”?

TIA

//===========================

编辑

另请参阅 Steve Siebert 的回答下与此相关的评论。

最佳答案

它的意思是那些 javadoc 规范准确说明了 hashCode 是如何创建的。通过这样做,应用程序现在可以依赖于它始终为真......现在这些实现永远不会改变 hashCode 的生成方式。

这并不意味着你不应该从你的值(value)观中推导出你的散列......只是不要告诉人们你是如何在你的规范中做到这一点的=)

关于java - 为什么值类的值是它的 hashCode "not a good idea"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26821532/

相关文章:

java - 如何将字符串解析为映射,使用java从文件位置读取的字符串

java - 从 HashMap 中获取前 k 个值

java - 了解 HashMap 和 IdentityHashMap

java - Okta Java 客户端 SDK 使用

java - LinkedList.subList(int, int) 的时间复杂度

javascript - 如何通过 hashmap 项进行迭代

struct - 遍历struct Hashmap并将值添加到self的另一部分

java - 不能从静态上下文中引用非静态变量

ruby - 减少数组时使用 Hash.new 作为初始值

ruby - 谁能解释一下?