HashMap
HashMap1.8结构图
put过程结构图
重要的属性
重要的方法put
1.7与1.8的区别
1.7数组+链表 1.8 数组+链表或红黑树
1.7 采用头插法 插入时,如果数组位置上已经有元素,将新元素放到数组中,原始节点作为新节点的后继节点 1.8尾插法 遍历链表,将元素放置到链表的最后
1.7 先判断是否需要扩容,再插入 1.8先进行插入,插入完成再判断是否需要扩容
1.7 扩容的时候需要对原数组中的元素进行重新hash定位在新数组的位置,1.8 采用更简单的判断逻辑,位置不变或索引+旧容量大小
好处是
-
防止发生hash冲突,链表长度过长,将时间复杂度由
O(n)
降为O(logn)
; -
因为1.7头插法扩容时,头插法会使链表发生反转,多线程环境下会产生环;