掌握HashMap扩容机制是Java面试必考点!本文详解触发条件(元素数>容量×0.75时2倍扩容)、数据迁移过程(高位判定位+红黑树拆分)及2的幂次方设计优势(位运算提速)。对比JDK1.7头插法死循环问题,1.8改用尾插法提升安全性。附赠百度网盘高频面试资料(提取码9b3g),包含扩容流程图解和面试话术,助你秒杀HashMap考点。通过面试鸭返利网购买会员可享25元返现,备战金三银四更高效!
🔥高频面试资料免费领!点击获取→
(链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g)
当HashMap中元素数量超过扩容阈值(threshold = capacity * loadFactor)时触发扩容。默认扩容因子为0.75,这意味着当哈希表填充达到容量的75%时,就会执行2倍扩容。这种设计既保证了空间利用率,又减少了哈希冲突概率。
HashMap会先创建一个容量为原数组2倍的新数组(例如从16扩容到32),这是为了保持容量始终为2的n次幂。这种设计使得计算元素下标时可以通过(n-1) & hash
快速定位,避免取模运算。
遍历旧数组的每个桶时,JDK1.8采用高位判定位算法:
if ((e.hash & oldCap) == 0) {
// 保持原下标位置
} else {
// 新位置=原下标+oldCap
}
这种位运算的效率远高于重新计算哈希值,整个过程时间复杂度为O(n)。
当桶中节点数超过8时,链表会转化为红黑树。迁移时会根据树节点的高位哈希值将树拆分为两个链表,如果拆分后链表长度小于6则退化为链表。
(n-1) & hash
等效于取模运算但效率更高在JDK1.7中,头插法迁移链表时多线程操作可能导致环形链表,进而引发死循环。JDK1.8改用尾插法解决了这个问题,但HashMap仍然是线程不安全的,高并发场景应使用ConcurrentHashMap。
小提示:如果需要购买面试鸭会员,通过面试鸭返利网联系我可返利25元,助你高效备战面试!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!