我想知道当加载因子超过阈值时Java
HashMap
调整大小时的时间复杂度是多少?据我所知,HashMap的表大小始终是2的偶数,所以每当我们调整表的大小时,我们都不需要重新调整所有键(如果我错了就纠正我),我们需要做的就是是没有分配额外的空格并复制旧表中的所有条目(我不太确定JVM如何在内部处理它),对吗?而对于Hashtable
,因为它使用素数作为表大小,所以每当我们重新调整表的大小时,我们都需要重新散列所有条目。所以我的问题是,在HashMap
上调整大小仍需要O(n)线性时间吗?
答案 0 :(得分:6)
所以我的问题是,在HashMap上调整大小仍然需要O(n)线性时间。
基本上,是的。
...所以每当我们调整表格大小时,我们都不需要重新修改所有密钥(如果我错了,请纠正我。
实际上,你 需要重新整理所有密钥。当您将哈希表大小加倍时,需要拆分哈希链。为此,您需要测试每个键的哈希值映射到的两个链中的哪一个。 (实际上,如果哈希表也有一个开放的组织,你需要做同样的事情。)
但是,在当前一代HashMap
实现(派生自Sun / Oracle代码库)中,哈希码值在链接的条目对象中缓存,因此哈希码为密钥不需要重新计算。
答案 1 :(得分:0)
调整表的大小时,必须将原始表的全部内容复制到新表中,因此需要花费O(n)时间来调整表的大小,其中n是原始表中元素的数量。 HashMap上任何操作的摊余成本(假设统一散列假设)是O(1),但是,单个插入操作的最坏情况成本是O(n)。