xdm,经历了3场面试后,我发现HashMap问的并不多,但是我还是要写,这次我要专门突破这个点。就是put的流程。
- 判断当前数组是否为空,为空的话则初始化
- 对key值进行hash函数计算
- key==null:直接返回0
- key!=null:hashCode的高16位异或hashCode的低16位(目的是hash散列的更开一点)
- 通过hash函数计算的结果&
桶长度-1
计算出所落数组的下标。(所以桶长度是2的幂,就是利用&计算下标导致的,这样计算会更快) - 获取数组下标的链表,若链表为null,此值自动成为链表的头结点
- 若链表不为null
- 若头结点key==新增节点key:直接找到了
- 若头节点是个
TreeNode
类型,则定是个红黑树,则通过红黑树插入新节点 - 否则,必定是个链表,顺序遍历
- 若最后链表中key已存在:则跳出遍历即可
- 若最后链表中key不存在:则新增个节点并需要判断当前链表是否结点树>8。大于8则尝试树化
- 将新增的这个key结点(可能是新增的节点,也可能是老节点)替换新value
- key-value数量++,若到达阈值则数组扩容
最后,树化的条件需要单链表中的key-value大于8个,且数组长度大于等于64才能树化哟