JAVA jdk1.8 HashMap 存值流程图解
原创
©著作权归作者所有:来自51CTO博客作者小目标青年来也的原创作品,请联系作者获取转载授权,否则将追究法律责任
最近面试很多人,发现都是有个大概的记忆,但是都不清晰,所以我决定整理一下,用图解的方式帮助 有缘分看到这篇文章的小伙伴 理解 hashmap里 put 存值的过程。
问到什么时候需要将链表转换成红黑树,基本大家的回答就只说到 链表长度达到8;
问到为什么需要转换红黑树,是为了解决什么场景问题,也是回答得不清楚;
但是该篇不对这些关于hashmap的相关问题梳理,因为这个已经是比较普遍的面试题了,现在学习成本非常低,随便找下都能看到相关的面试题。
可以双击原图阅读
JCccc
简单的文字梳理:
开始
1.判断位桶数组table是否为空 transient Node<k,v>[] table;
1.1 如果为空,则进行第一次的扩容 ,分配默认值 数组初始容量 1 << 4 =16,同时设置扩容阀值 16*0.75
2.利用put的key值计算hash得出插入table的索引位置
2.1判断当前的 table[索引值] 是否为null,若为空,进入3步骤
2.2 如果不为空,那么需要判断是否key值已存在
2.2.1 存在 ,直接覆盖
2.2.2 不存在,进入2.3
2.3判断当前table[索引值]下是否为链表/红黑树
2.3.1 如果是链表,开始遍历链表进行插入,
插入前计算插入后链表长度是否达到8,如果大于则转换为红黑树结构,进行key & value的插入。
如果链表长度没有达到8,那么插入时查找是否已经存在key,存在则覆盖value值;不存在则进行key & value的插入。
2.3.2 如果是红黑树,那么进行key & value的插入(存在覆盖value)
3.直接创建出新的节点,进行key & value 值插入 tab[i] = newNode(hash, key, value, null);
4.判断当前容量是否已经超越了hashmap的扩容阈值(初始容量 16 * 加载因子 0.75) if (++size > threshold)
结束