我已经阅读了主题中的所有帖子,我仍然对以下内容感到困惑:何时可能发生重写和碰撞?从我的阅读中我看到:
equals()
方法方面相同时,它们的哈希码必须相同equals()
方法上不相同时,我们无法保证hashcode()
,即它可能相同,可能会有所不同HashMap.put(key, value)
时,HashMap按照equal()
方法比较对象。如果两个密钥为equal()
,则新value
为覆盖 hashcode
,则会发生碰撞并且Java处理它hashCode()
必须相同,因此必须发生碰撞,这与以前?有人可以为我澄清这些步骤吗?
答案 0 :(得分:4)
将hashmap视为一组鸽子洞。每个鸽笼洞都可以包含多个物体。
hashCode()
返回用于选择包含或将包含该对象的鸽子洞。
equals()
用作标识特定对象的标准(例如替换)。
hashCode()
的目的是将典型物体均匀地分散在鸽笼孔中。一旦确定某个鸽子洞可能包含一个物体,那么必须检查该特定群体中的所有物体。由于需要调用equals()
,因此该操作很昂贵。
答案 1 :(得分:2)
你的观点#3来得太早了:当hashCode
相同时,HashMap会比较相等 。
HashMap
首先检查哈希码,以确定对象在存储桶中的位置。常规HashMap
只保留同一个桶中具有相同哈希码(以一定数量为模)的项,并仅检查同一桶中对象的相等性。