java HashMap 有独特的设计。
哈希表数组的每个位置是一个哈希桶,里面由链表或红黑树实现。(> 8 或 < 6 的变化时,避免频繁切换)
-
容量(capacity): 哈希表中桶(bucket)的数量,默认初始容量为 16
-
负载因子(load factor): 衡量哈希表多满时进行扩容的指标,默认值为 0.75。
扩容是2倍。
高效哈希
以 HashMap 的哈希方式,扩容只需要挪动一半的数据。
在 Java 的 HashMap 中,哈希桶的索引是通过**目标值 与运算(哈希表大小-1)**计算 (这里的 n 是当前哈希表的容量,2的幂,n-1就是全1)。
当进行扩容时,容量 n 变为原来的 2 倍,新的索引计算方式变为 (2n - 1) & hash。扩容后只多一个 1 位。
那我们再次进行与操作,最高位要么是1,要么是0.
- 通过高位掩码拆分,元素更均匀分布到新桶中,降低后续操作的冲突概率。
- 利用位运算直接确定新位置,无需重新计算哈希值,减少了计算开销。