点击领取优惠~
361 字
2 分钟
jdk1.8 对 HashMap 主要做了哪些优化呢?
jdk1.8 对 HashMap 主要做了哪些优化呢?
jdk1.8 的 HashMap 主要有五点优化:
- 数据结构:数组 + 链表改成了数组 + 链表或红黑树原因:发生 hash 冲突,元素会存入链表,链表过长转为红黑树,将时间复杂度由O(n)降为O(logn)
- 链表插入方式:链表的插入方式从头插法改成了尾插法简单说就是插入时,如果数组位置上已经有元素,1.7 将新元素放到数组中,原始节点作为新节点的后继节点,1.8 遍历链表,将元素放置到链表的最后。原因:因为 1.7 头插法扩容时,头插法会使链表发生反转,多线程环境下会产生环。
- 扩容 rehash:扩容的时候 1.7 需要对原数组中的元素进行重新 hash 定位在新数组的位置,1.8 采用更简单的判断逻辑,不需要重新通过哈希函数计算位置,新的位置不变或索引 + 新增容量大小。原因:提高扩容的效率,更快地扩容。
- 扩容时机:在插入时,1.7 先判断是否需要扩容,再插入,1.8 先进行插入,插入完成再判断是否需要扩容;
- 散列函数:1.7 做了四次移位和四次异或,jdk1.8 只做一次。原因:做 4 次的话,边际效用也不大,改为一次,提升效率。
jdk1.8 对 HashMap 主要做了哪些优化呢?