hashCode()用于Java

gab*_*los 7 java hashcode

我在一本书中读到了一个hashCode()显示内存区域的书,该内存区域有助于(例如HashSets)在内存中找到合适的对象.但是,如果我们不能直接在Java中操作内存,那怎么可能呢?没有指针,除了它创建对象和从一个地方移动到另一个地方,开发人员不知道它.

我读到这种认识hashCode() {return 42;}很可怕,但是如果我们不能指示VM在哪里放置我们的对象有什么区别呢?

问题是:hashCode()如果我们不能操纵记忆,深层次的目的是什么?

Jon*_*eet 8

我在一本书中读到hashCode()显示了一个内存区域,它帮助(例如HashSets)在内存中定位适当的对象.

不,这完全是对目的的虚假描述hashCode.它用于以有效的方式查找可能相等的对象.它与内存中对象的位置无关.

这个想法是,如果你有类似的东西HashMap,你想在查找时快速找到匹配的密钥.因此,您首先检查所请求密钥的哈希码,然后您可以使用该哈希码真正有效地查找地图中的所有密钥.然后,您可以检查每个(并且只有那些)候选键是否与请求的密钥相等.

有关更多信息,请参阅有关哈希表Wikipedia文章.


Nat*_*hes 5

我喜欢Jon Skeet的答案(+1),但它需要知道哈希表是如何工作的.哈希表是一个数据结构,基本上是一个桶数组,它使用密钥的哈希码来决定将哪个桶放入该条目.这样,将来调用以检索该密钥的任何内容都不必筛选整个存储在哈希表中的事物列表,哈希表可以计算密钥的哈希码,然后直接进入匹配桶并查看.哈希码必须是可以快速计算的东西,你宁愿它是唯一的,但如果它不是它不是灾难,除了在最坏的情况下(你的return 42;),这是坏的,因为一切都在同一个斗,你回来筛选一切.

Object#hashCode的默认值可能基于类似于内存位置的东西,因为它是一个方便的随机数排序,但是在内存管理期间对象被分流,这个值被缓存并且无论如何都无关紧要.由不同对象(如String或BigDecimal)创建的哈希码当然与内存无关.它只是一个快速生成的数字,并且您希望它经常是独一无二的.