hashmap的扩容

229 阅读1分钟

hashmap的扩容只的是数组的扩容。

1.7扩容过程

  1. 生成新的2倍长度的数组
  2. 计算key值该放在新的数组中哪个位置
  3. 注意:数组在扩容后,每个桶里的链表,顺序将会相反

扩容死循环

因为1.7是头插法,链表的顺序在扩容后将相反,当多个线程进行扩容操作,会出现链表内出现环,导致get时cpu占用100%

1.8扩容过程

  1. 多了一个低位和高位的概念,新的数组的长度就是会多一个1在前面(二进制),那么低位的意思就是在老的那个桶,高位就是会在扩容之后才有的那个桶中。
  2. 扩容时,把链表的节点用尾插法插在低位和高位,高位相当于低位+oldLength
  3. 把链表转为红黑树,先把链表转为双向链表。在把双向链表转为红黑树

红黑树

  1. 红黑树的属性:父节点,左子,右子,next,pre,isRed。
  2. 红黑树的节点,既是红黑树的节点,又是链表的节点(双向列表)
  3. 红黑树的根节点一定是黑的
  4. 插入红黑树,需要先比较(比较hash)应该插在左边还是右边,插完后看看符不符合红黑树定义,不符合就调整。