// 参数onlyIfAbsent表示是否替换原值 // 参数evict我们可以忽略它,它主要用来区别通过put添加还是创建时初始化数据的
(每一次扩容为 原来的两倍)1.如第四章图
首先判断是否为空 或长度为零 在hashMap刚创建的时候 判断是为了 初始化 为 16个 桶
根据hash计算出的值(key的hash值 空的返回0 不空的返回相应的hash值 ) 去找到 存放的位置 如果 key为空直接添加到table中 如果位置存在 去查找key存在的位置 看是否 存在 (存在就覆盖)
否 到 树的节点(或者是确认是否为红黑树) 是红黑树 就插入
不是红黑树 树节点 遍历插入(两个hashcode值相同 key 不同 以链表形式保存)p.next 为链表 插入一个新节点在 相同hashcode值的位置值 以链表的形式 如果 链表的长度大于 8 则会 转为 红黑树 然后 红黑树插入
如果当前haspMap 容量超过 threshold 就扩容