xdm,经历了3场面试后,我发现HashMap问的并不多,但是我还是要写,这次我要专门突破这个点。就是put的流程。

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

      最后,树化的条件需要单链表中的key-value大于8个,且数组长度大于等于64才能树化哟 image.png