最近面试很多人,发现都是有个大概的记忆,但是都不清晰,所以我决定整理一下,用图解的方式帮助 有缘分看到这篇文章的小伙伴 理解 hashmap里 put 存值的过程。

问到什么时候需要将链表转换成红黑树,基本大家的回答就只说到 链表长度达到8;
问到为什么需要转换红黑树,是为了解决什么场景问题,也是回答得不清楚;
但是该篇不对这些关于hashmap的相关问题梳理,因为这个已经是比较普遍的面试题了,现在学习成本非常低,随便找下都能看到相关的面试题。

 

 

可以双击原图阅读


JAVA jdk1.8 HashMap 存值流程图解_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)

结束