当 HashMap<String, Integer> map = new HashMap<>(16, 0.75f); 这个16改成3可以吗?
答案:
非 2 的幂次方: 当容量不是 2 的幂次方时,capacity - 1
的二进制表示将包含多个 1,这使得位掩码操作(hash & (capacity - 1)
)不能简单地映射到桶的索引。
- 例子:
- 假设
capacity
是 6(即00000110
),capacity - 1
是 5(即00000101
)。 - 如果
hash
是101010
,则hash & (capacity - 1)
计算为101010 & 00000101
,结果是00000000
,即 0。 - 这可能会导致索引分布不均匀,因为计算结果可能没有准确地反映哈希值的实际位置。
- 假设
为什么不均匀呢?
答案:
当 HashMap
的容量不是 2 的幂次方时,计算桶索引的操作效率会降低,主要是因为位掩码操作(hash & (capacity - 1)
)不再适用。以下是详细的解释:
位掩码操作的工作原理
1. 位掩码操作
当容量为 2 的幂次方时(例如 16、32、64 等),计算桶的索引可以通过位掩码操作来高效完成。这是因为: