一:resize扩容
- 当前table Node数组赋给临时变量,并记录老table的初始化容量和加载因子
- 如果老初始化容量大于0,新表初始化容量直接扩大为原来的2倍
- 循环老table,对新table赋值
1) 如果如果链表只有一个,则进行直接赋值
newTab[e.hash & (newCap - 1)] = e
2)如果红黑二叉树:……
3)链表赋值,如果新表位置变化
e.hash & oldCap) == 0
, 则老表数据在新表位置为(老数组位置i+老数组容量oldCap)
1 | final Node<K, V>[] resize() { |
二、线程安全
JDK-1.7 线程不安全
resize()导致线程不安全
1 | transfer()函数逻辑 |