262 字
1 分钟
JDK 1.8 对 HashMap 的三项重要改进
JDK 1.8 对 HashMap 的改动不只是在冲突严重时树化,还集中在哈希计算、扩容和链表迁移三个环节。
哈希函数更简单
JDK 1.7 的 hash 处理多次异或;JDK 1.8 主要将 key 的 hashCode 高 16 位与低 16 位异或,在保证高低位参与索引计算的同时减少运算开销。
扩容不再逐个取模
容量翻倍后,元素要么留在原下标,要么移动到“原下标 + 旧数组长度”。通过一次位运算即可判断迁移方向,避免对每个元素重新计算 hash % newCapacity。
头插法改为尾插法
JDK 1.7 扩容时采用头插法,链表顺序会反转;并发扩容时可能形成环,导致 CPU 空转。JDK 1.8 对链表迁移按高低位分组并保持组内相对顺序,避免了旧迁移方式的这种成环问题。但并发更新仍可能丢失数据,HashMap 仍然不线程安全。

JDK 1.8 对 HashMap 的三项重要改进
https://blog.xqcherry.top/posts/interview/java/hashmap-jdk8-improvements/ 目录