【发布时间】:2015-05-08 08:47:59
【问题描述】:
我了解 HashMap 如何工作的基础知识 - hm.put(obj) 根据 obj.hashCode 值找到正确的存储桶来放置对象。然后在该桶中,如果另一个对象 .equals(obj) 则替换它,如果没有将其添加到桶中。
但我不清楚 HashMap.put 和 HashMap.get 如何可以是常数时间 O(1)。据我了解,存储桶的数量应基于哈希码,因此将 100 个对象放入哈希图中将(大致)创建 100 个存储桶(我确实了解哈希码有时会发生冲突,因此它可能小于 100 但不是经常)。
所以随着添加到哈希图中的对象数量的增加,桶的数量也会增加 - 由于冲突很少,这并不意味着桶的数量几乎随着添加的对象数量线性增长,其中case HashMap.put/HashMap.get 将是 O(n),因为它必须在找到正确的存储桶之前搜索每个存储桶。
我错过了什么?
【问题讨论】:
-
哈希表的全部意义在于它不需要搜索每个桶。
-
将哈希映射视为由对象的哈希码索引的存储桶数组。那是
O(1),除非发生碰撞;桶得到更多的项目。 -
为什么你认为 get() 必须搜索每个桶?正如您在第一行中提到的,键的哈希码将给出数组中的存储桶位置,因此您不必搜索所有存储桶。
标签: java algorithm hashmap big-o