小编典典

HashMap 获取/放置复杂度

all

我们习惯说HashMap get/put操作是 O(1)。但是,这取决于哈希实现。默认对象哈希实际上是 JVM
堆中的内部地址。我们确定声称get/put是 O(1) 就足够了吗?

可用内存是另一个问题。正如我从 javadocs 中了解到的,HashMap负载因子应该是 0.75。如果我们在 JVM
中没有足够的内存并且负载因子超过了限制怎么办?

所以,看起来 O(1) 是不能保证的。这有意义还是我错过了什么?


阅读 57

收藏
2022-08-20

共1个答案

小编典典

这取决于很多事情。它 通常是 O(1),有一个像样的散列,它本身是恒定的时间......但是你可能有一个需要很长时间来计算的散列, 并且
如果散列图中有多个项目返回相同的散列码,get将不得不遍历它们,调用equals它们中的每一个来找到匹配项。

在最坏的情况下,HashMap由于遍历同一散列桶中的所有条目(例如,如果它们都具有相同的散列码),因此具有 O(n)
查找。幸运的是,根据我的经验,这种最坏的情况在现实生活中并不经常出现。所以不,当然不能保证 O(1) - 但在考虑使用哪些算法和数据结构时,通常应该假设它。

在 JDK 8
中,HashMap已经进行了调整,如果可以比较键以进行排序,那么任何密集填充的存储桶都被实现为树,因此即使有很多具有相同哈希码的条目,复杂度也是
O(log n)。当然,如果您有一个相等和排序不同的键类型,这可能会导致问题。

是的,如果你没有足够的内存来存储哈希映射,你就会遇到麻烦......但无论你使用什么数据结构,这都是真的。

2022-08-20