如何确定散列映射已满,因为每个散列映射桶都可以包含大量条目

时间:2017-02-23 10:08:47

标签: java collections hashmap

基于加载因子增加了hashmap的大小,但是如何确定hashmap已经变满,因为每个hashmap bucket可以包含大量条目。为什么要创建新桶而不是向现有存储桶添加条目?有没有办法确定存储桶中的条目数? 负载系数如何发挥作用?我们假设初始容量为16且负载因子为0.75,那么在存储了多少条目后,哈希映射将被重新定义?因为16 * 0.75是12,所以在我们存储12个条目之后它会被重新组合,还是在12个桶有条目并且剩余的桶是空的之后它会重新散列?这12代表到底是什么?

2 个答案:

答案 0 :(得分:0)

因为如果我们向现有存储桶添加条目,这些条目将以存储区中的列表格式存储,这将增加get方法的运行时间。 因为list需要O(n)来比较元素。

答案 1 :(得分:0)

如何确定hashmap已经满了?

理论上它不能说是完整的。我们仍然可以将任意数量的对象添加到存储桶的链接列表中(正如您所说)。

假设有很多(key,value)条目正在添加到HashMap中。理想情况下,HashMap函数(get,put,contains)必须在O(1)中工作。为了实现它,每个HashMap桶只需要存储一个(键,值)对。每当哈希映射发生冲突时,它必须重新组织它的底层数据结构以促进理想的散列。为每次冲突重新组织内部数据结构是一项复杂的操作,它会降低哈希映射的性能。

因此决定允许一些碰撞。当地图中的元素数量达到最大阈值时,完成哈希映射的重新散列。在重新散布时,底层存储桶将变为double,并且(key,value)将映射到这些新的存储桶集。

通过这样做,桶中的(键,值)对的数量通常会下降。 因此,通过使用额外的空间,哈希映射更好。

有没有办法确定存储桶中的条目数?

在HashMap中,我们无法知道每个桶中的条目数。即使我们知道我们也不能只拆分那个桶。例如,HashMap中当前有16个存储桶,如果我们知道许多(Key,Value)对映射到存储桶,我们就不能简单地将该存储桶拆分为2.我们无法显式创建新存储桶来共享负载那桶在这两种情况下,桶计数应该变为17.但是HashMap应该总是将桶的数量设置为n的幂。因此,我们不能对知道存储桶中的条目数做任何特殊操作。因此在HashMap中,不会进行桶级决策。全局决策将根据HashMap中的条目数量完成。