jdk1.8对HashMap主要做了哪些优化呢?为什么?

JDK 1.8对HashMap进行了五点优化,具体如下:

  1. 数据结构:数组+链表的组合改为了数组+链表或红黑树的组合。

原因:当发生哈希冲突时,元素会被存储在链表中。但是当链表长度过长时,JDK 1.8会将链表转换为红黑树,从而将查找时间复杂度从O(n)降低到O(logn),提升性能。

  1. 链表插入方式:链表的插入方式从头插法改为了尾插法。

原因:在插入新元素时,JDK 1.7采用头插法,将新元素插入到数组位置中,并将原节点作为新节点的后继节点。而JDK 1.8采用尾插法,遍历链表,将新元素放置在链表的末尾。

原因:JDK 1.7的头插法在扩容时可能导致链表反转,特别是在多线程环境下可能会出现环形链表。

  1. 扩容rehash:在扩容时,JDK 1.7需要对原数组中的元素进行重新哈希计算,确定它们在新数组中的位置。而JDK 1.8采用更简单的判断逻辑,无需重新计算位置,新位置要么保持不变,要么为原索引加上新容量大小。

原因:JDK 1.8的优化可以提高扩容的效率,更快地完成扩容操作。

  1. 扩容时机:在插入元素时,JDK 1.7先判断是否需要扩容,然后再进行插入操作。而JDK 1.8先进行插入操作,待插入完成后再判断是否需要扩容。
  2. 散列函数:JDK 1.7中的散列函数进行了四次移位和四次异或操作,而JDK 1.8只进行了一次散列操作。

原因:进行四次散列操作边际效益不大,因此JDK 1.8简化为一次散列操作,提升散列的效率。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题