java - HashMap 中可以发生多少次重新哈希

标签 java hash hashmap

最近参加一个面试,面试官问了我这个问题。

在一个 HashMap 中一次可以发生多少次重新散列?两次?还是N次? [当每次添加(阈值+1)个元素时]

我知道本地图已满时,很可能是我们做错了什么。

我承认我没能给出满意的答案。谁能告诉我回答此类问题的方法。

或者,面试官究竟在寻找什么令人信服的答案?

下面是我在问这个问题之前提到的一些 SO 问题。

https://stackoverflow.com/a/28811708 “当映射中的元素数量达到阈值时,将完成 HashMap 的重新散列” HashMap 的负载因子为 0.75,默认初始容量值为 16。一旦元素数量达到或超过 12,元素容量重新散列 map 发生。

Rehashing in Hashmap

当hash map中的条目数超过负载因子和当前容量的乘积时,hash map被rehashed(重建内部数据结构),使得hash map有大约两倍的桶数。 当您重新散列并将所有内容移动到新位置(存储桶等)时,旧元素也会再次重新散列并根据其新散列码存储在新存储桶中。分配用于存储元素的旧空间被垃圾收集。

https://stackoverflow.com/a/27384645/5086633

最佳答案

这取决于 map 的种类。

例如,对于一个 HashMap,存在一个定义如下的调整大小的方法:

Rehashes the contents of this map into a new array with a larger capacity. This method is called automatically when the number of keys in this map reaches its threshold. If current capacity is MAXIMUM_CAPACITY, this method does not resize the map, but sets threshold to Integer.MAX_VALUE. This has the effect of preventing future calls. Parameters: newCapacity the new capacity, MUST be a power of two; must be greater than current capacity unless current capacity is MAXIMUM_CAPACITY (in which case value is irrelevant).

因此根据这个定义,可以将 Map 以 2 的幂为步长放大到 MAXIMUM_CAPACITY

MAXIMUM_CAPACITY 的值为

static final int MAXIMUM_CAPACITY = 1 << 30;

这个值为 1.073.741.824。

构建一个新的 HashMap 显式初始容量为 1,您最多可以调整 30 次大小,因为 2^30 = MAXIMUM_CAPACITY = 1.073.741.824

关于java - HashMap 中可以发生多少次重新哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949836/

相关文章:

php - 如何加密插入到 MySQL 表中的密码?

php - 使用 md5 安全更难

针对写入优化的并发数据结构

java - Groovy 空格分隔的 HashMap 键

java - IBM Websphere 命令缓存失效

java - 如何从 Netbeans 中的 pl/sql 函数获取结果

java - RxJava - 按顺序上传文件 - 在调用 onNext 时发出下一个项目

algorithm - 散列中单独链接和开放寻址的时间复杂度

java - 如果整数小于 16,则将整数转换为字节

java - 使用 ibatis 将 HashMap 值插入到表中