Effective Java,第 2 版,J. Bloch 的第 9 项 的最后一段
表示,对于 Integer
、String
、Date
等值类,
返回该类的精确值的函数作为
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/