

- 首先判断 table 成员是否初始化,如果没有,则调用 resize。
- 通过传入键值对的 key 的 hashCode 和 容量,马上得到该映射所在的 table 数组下标。并通过数组的取下标的操作,得到该哈希桶的头节点。
- 如果没有发生哈希碰撞(头节点为nul),那么直接执行新增操作。
- 如果发生了哈希碰撞(头节点不为nul),那么分为两种情况:
- 如果与桶内某个元素 ‘==’ 返回 true,或者 equals 判断相同,执行替换操作。
- 如果与桶内所有元素判断都不相等,执行新增操作,可能是链表也可能是红黑树的插入。
- 链表新增操作后会 有两个判断:
- 如果哈希桶是单链表结构,且桶内节点数据超过 TREEIFY_THRESHOLD(8),且 size 大于等于了 MIN_TREEIFY_CAPACITY(64),那么将该哈希桶转换为红黑树结构。
- 如果新增后 size 大于 threshold,那么调用 resize。
JDK8中 HashMap源码之插入


将 key 的 hashCode 与该 hashCode 的无符号右移16位,异或起来得到的。
扰动实现简单 一共2次扰动 1次异或 加上1次位运算
HashMap源码之插入
