HashMap的put方法

  1. 判断数组是否为空
  • 为空,进行初始化
  1. 不为空,计算key的hash值,
  • 通过(n-1)&hash 计算应当存放在数组中的下标index。
  1. 查看table[index]是否存在数据,
  • 没有数据,就构造一个Node节点存放在table[index]中。
  1. 存在数据,说明发生了hash冲突(存在两个节点key的hash值一样)
  • 继续判断key是否相等
  • 相等,则用新的value替换原数据(onlyIfAbsent为false).
  1. 如果不相等,判断当前节点类型是不是树型节点
  • 如果是树型节点,创造树型节点,插入红黑树中
    (如果当前节点是树型节点,证明当前已经是红黑树了)
  1. 如果不是树型节点,创建普通Node加入链表中。
  • 还要判断链表长度是否大于8,且数组长度大于64.
  • 大于的话,链表要转换为红黑树
  1. 插入完成之后,判断当前节点树是否大于阈值,
  • 如果大于,开始扩容为原数组的 2倍。

补充,判断key相等的步骤

p.key 与传入的 key 先通过引用 == 判等;若不相等,则调用 key.equals(k) 进一步判断。

onlyIfAbsent要区别true和false,它是一个防止覆盖已存在值”的开关:

posted @ 2025-05-16 11:56  kuki'  阅读(7)  评论(0)    收藏  举报