与Java中的hashmap混淆?

时间:2014-07-24 09:33:45

标签: java hashmap hashtable

我已经阅读了主题中的所有帖子,我仍然对以下内容感到困惑:何时可能发生重写和碰撞?从我的阅读中我看到:

  • 每当两个对象在equals()方法方面相同时,它们的哈希码必须相同
  • 每当两个对象在equals()方法上不相同时,我们无法保证hashcode(),即它可能相同,可能会有所不同
  • 当我们使用HashMap.put(key, value)时,HashMap按照equal()方法比较对象。如果两个密钥为equal(),则新value覆盖
  • 如果两个kay具有相同的hashcode,则会发生碰撞并且Java处理它
  • 然而如果两个键相等则新值被覆盖,但它也意味着hashCode()必须相同,因此必须发生碰撞,这与以前?

有人可以为我澄清这些步骤吗?

2 个答案:

答案 0 :(得分:4)

将hashmap视为一组鸽子洞。每个鸽笼洞都可以包含多个物体。

hashCode()返回用于选择包含或将包含该对象的鸽子洞。

equals()用作标识特定对象的标准(例如替换)。

hashCode()的目的是将典型物体均匀地分散在鸽笼孔中。一旦确定某个鸽子洞可能包含一个物体,那么必须检查该特定群体中的所有物体。由于需要调用equals(),因此该操作很昂贵。

答案 1 :(得分:2)

你的观点#3来得太早了:当hashCode相同时,HashMap会比较相等

HashMap首先检查哈希码,以确定对象在存储桶中的位置。常规HashMap只保留同一个桶中具有相同哈希码(以一定数量为模)的项,并仅检查同一桶中对象的相等性。