【Java集合】HashMap的扩容
2025/12/11...大约 1 分钟
1.HashMap为什么扩容是2的幂次
HashMap扩容时会扩为2倍,此外,当创建 HashMap 并指定一个初始容量(比如 new HashMap(10))时,HashMap 内部会也自动将这个容量调整为大于等于指定值的最小2的幂。
扩容采用2的幂次是为了优化哈希计算效率。具体原理如下:
先计算当前key的hash值,当 HashMap 容量为16时,计算槽位的方式为 hash & (16-1),即 hash & 15。由于15的二进制只有最后4位是1(0000 1111),因此计算结果的有效部分仅为哈希值的最后4位,这4位就决定了键值对存放的槽位索引。
当需要扩容时(例如从16扩容到32),新的槽位计算方式变为 hash & (32-1),即 hash & 31。31的二进制为 0001 1111,相比15(0000 1111)多出了一位有效的“1”,如果该位为 0,则新槽位索引保持不变,如果该位为 1,则新槽位索引变为 **原索引 + 原容量(oldCap)。
验证示例:
掩码 mask = 15(二进制 0000 1111)| 掩码 mask = 31(二进制 0001 1111)
例1:hash=37(二进制 0010 0101)
- 旧索引:
0010 0101 & 0000 1111 = 0101= 5 - 新索引:
0010 0101 & 0001 1111 = 00101= 5(新增位为0,保持不变)
例2:hash=53(二进制 0011 0101)
- 旧索引:
0011 0101 & 0000 1111 = 0101= 5 - 新索引:
0011 0101 & 0001 1111 = 10101= 21(新增位为1,5+16=21)