JDK 1.8 对 HashMap 进行了多项重要改进,以下是主要区别:
1. 数据结构差异
-
JDK 1.7:数组 + 链表
-
JDK 1.8:数组 + 链表 + 红黑树(当链表长度超过8时转换为红黑树)
2. 插入方式
-
JDK 1.7:头插法(新元素插入链表头部)
-
JDK 1.8:尾插法(新元素插入链表尾部)
3. 扩容机制
-
JDK 1.7:
-
先扩容再插入新元素
-
重新计算所有元素的位置(hash & (newCap-1))
-
-
JDK 1.8:
-
先插入新元素再判断是否需要扩容
-
优化了重新计算位置的算法,元素新位置要么是原位置,要么是原位置+旧容量
-
4. 哈希算法简化
-
JDK 1.7:使用了更复杂的哈希算法(9次扰动处理)
-
JDK 1.8:简化了哈希算法(只有1次扰动处理)
5. 并发安全性
-
两者都不安全,但JDK 1.8改进了扩容方式,减少了死循环的可能性
6. 性能改进
-
JDK 1.8在哈希冲突严重时(链表长度>8)使用红黑树替代链表,查询时间复杂度从O(n)降到O(log n)
7. 方法实现
-
JDK 1.8新增了一些方法如:
getOrDefault()
,putIfAbsent()
,compute()
,merge()
等
这些改进使得JDK 1.8中的HashMap在性能上(特别是高冲突情况下)比JDK 1.7有显著提升,同时减少了在多线程环境下出现问题的可能性。