HashMap的长度为什么是2的N次幂?
HashMap 的容量(长度)之所以选择为2的n次幂(如16、32、64等),主要是基于以下几点考虑:
-
位运算加速:当 HashMap 的容量是2的幂时,可以利用位运算(特别是右移运算
>>
和按位与运算&
)来替代模运算(%
),提高计算效率。具体来说,对于任何整数hash
,hash & (length - 1)
的效果等同于hash % length
,但位运算比模运算更快。这里的length
是HashMap的容量,由于它是2的幂,length - 1
就是一个所有二进制位都是1的数字,与操作能直接定位到索引位置。 -
均匀分布:2的幂次方可以更好地确保哈希值分布的均匀性。因为当哈希码的高位变化时,低位变化的概率也会相对均匀,这有助于减少哈希碰撞,提高数据分布的均匀性,从而提升 HashMap 的查找效率。
-
简化扩容逻辑:当 HashMap 需要扩容时(负载因子超过阈值),新的容量通常是原容量的两倍,仍然保持为2的幂。这样,原来位于索引 i 的元素,在扩容后,要么依然在索引 i,要么移动到索引 i + 原容量。这种规则简化了扩容时重新分配元素的逻辑,减少了数据迁移的工作量。
综上所述,HashMap 容量设计为2的幂主要是为了提高性能,包括利用位运算加速索引计算、确保哈希值分布均匀以及简化扩容操作。
收藏文章数量从多到少与“把书读薄”是一个道理