
2021-01-22:java中,HashMap的写流程是什么?
发布日期:2021-05-04 20:00:50
浏览次数:17
分类:技术文章
本文共 1009 字,大约阅读时间需要 3 分钟。
福哥答案2021-01-22:
jdk1.7写流程: 1.如果table数组为空,table数组初始化,调用inflateTable方法。 2.如果key为null,调用putForNullKey()方法,表示插入一个键为null的键值对。否则就是步骤3。 3.根据key计算hash,调用hash()方法。 4.计算下标,调用indexFor()方法。 5.遍历链表,如果找到元素,直接替换旧值。然后调用recordAccess()空方法。 6.没找到元素时,modCount自增。 7.新增元素,调用addEntry()方法。 7.1.是否需要扩容。size是否大于阈值,当前传入的下标在table中的位置不为null。如果不需要扩容,跳到步骤7.4。 7.2.扩容,调用resize()方法。 7.3.调用hash()计算哈希,调用indexFor()计算下标。 7.4.创建新的Entry节点。调用createEntry()方法。 7.4.1.获取table[新索引] 7.4.2.创建一个新的Entry对象,新索引位置的元素作为新的Entry对象的next元素,也就是说是头插法,然后赋值给table[新索引]。 7.4.3.长度加1。jdk1.8写流程:
1.计算hash。调用hash()方法。 2.调用putVal()方法。 2.1.判断键值对数组table[i]是否为空或为null,如果是,执行resize()进行扩容; 2.2.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向步骤2.6,如果table[i]不为空,转向步骤2.3; 2.3.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向步骤2.4,这里的相同指的是hashCode以及equals; 2.4.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向步骤2.3; 2.5.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可; 2.6.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。发表评论
最新留言
很好
[***.229.124.182]2025年03月16日 06时34分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vivos7和荣耀x10哪个好 vivos7和荣耀x10区别评测
2019-03-03
R3 PRO 3200G和r7 3700u 哪个好
2019-03-03
入手评测 联想小新Pro14和Air14Plus哪个好?区别对比
2019-03-03
0002 计算长方形周长和面积
2019-03-03
程序人生:没有伞的孩子要学会奔跑
2019-03-03
Express Animate for mac(动画特效制作软件)
2019-03-03
Cookie for Mac(浏览器缓存清理软件)
2019-03-03
macOS Big Sur系统中如何开启设置触控板三指拖拽功能?
2019-03-03
Resize Sense for Mac(图像处理软件)
2019-03-03
TG Pro for mac(硬件温度检测工具)
2019-03-03
SyncTime for mac(简单的文件同步工具)
2019-03-03
如何在Mac上关闭Siri?
2019-03-03
修复苹果Mac中的快速视频播放错误的方法
2019-03-03
MAC电脑Command键调换为Control键的方法
2019-03-03
苹果HomePod智能音箱怎么使用广播功能?
2019-03-03
Mac系统投屏到电视机的方法
2019-03-03