map 1
2021-09-17 16:27:45 0 举报
HashMap put&初始化流程图
作者其他创作
大纲/内容
执行扩容策略
结束 返回null
判断初始化若无,则调用resize进行初始化
直接将元素放入当前桶
将链表转化为红黑树
N
put流程
将链表转为红黑树
结束,返回新数组
Y
数组扩容新数组为旧数组2倍之后遍历所有桶
当前元素与桶内第一个值的hash值和(key的地址或者值)是否一致(第一个节点是不是就是新插入节点)
如果是红黑树执行红黑树方法
调用putVal方法将key的hash值传入
如果总节点数<64
旧数组数据重新hash
遍历当前桶所有节点 1.如果当前桶只有一个值,计算下标直接放入新数组2.设置一条新链作为在新桶的链表,一条旧链表示还在当前桶的链表。3.遍历当前桶链表所有节点,如果节点的hash & oldCap==0则是旧链表,否则是新链表4. 将旧链放到当前桶,新链放到当前桶下标+旧容量的位置
设置新的阈值容量*负载因子
则阈值有初值>0新的容量为此值
如果当前链上节点>=8
一致则替换掉旧节点的值
1如果桶为null跳过
resize扩容
使用hash计算当前元素存放下标,计算公式(n-1) & hash
具体数据扩容方式
如果size个数>阈值
设置容量为默认容量16设置阈值为16 * 0.75无参构造
初始化流程
如果使用的是指定容量指定负载因子的构造器
将阈值设置为旧容量,然后返回旧数组
当前桶无hash冲突
如果旧容量>=最大容量
如果遍历途中有和新节点一样的hash一样的key的,则
如果是树节点,则进行红黑树添加
否则遍历当前桶内链表,添加到尾节点
扩容策略
0 条评论
下一页