hashmap的扩容只的是数组的扩容。
1.7扩容过程
- 生成新的2倍长度的数组
- 计算key值该放在新的数组中哪个位置
- 注意:数组在扩容后,每个桶里的链表,顺序将会相反
扩容死循环
因为1.7是头插法,链表的顺序在扩容后将相反,当多个线程进行扩容操作,会出现链表内出现环,导致get时cpu占用100%
1.8扩容过程
- 多了一个低位和高位的概念,新的数组的长度就是会多一个1在前面(二进制),那么低位的意思就是在老的那个桶,高位就是会在扩容之后才有的那个桶中。
- 扩容时,把链表的节点用尾插法插在低位和高位,高位相当于低位+oldLength
- 把链表转为红黑树,先把链表转为双向链表。在把双向链表转为红黑树
红黑树
- 红黑树的属性:父节点,左子,右子,next,pre,isRed。
- 红黑树的节点,既是红黑树的节点,又是链表的节点(双向列表)
- 红黑树的根节点一定是黑的
- 插入红黑树,需要先比较(比较hash)应该插在左边还是右边,插完后看看符不符合红黑树定义,不符合就调整。