HashMap的put?

put添加元素的流程
1 首先会去借助哈希值计算桶索引的值,运算函数为(n-1)&hash值进行与计算。
:计算哈希值,jdk7之前是直接引用哈希值计算,而jdk8开始则借助哈希扰动的算法,原理呢就是将原哈希值向右移动16位,异或运算哈希值,将高位哈希值与地位哈希值都可以很好的参与到计算当中,减少哈希冲突的概率

2 判断该桶索引位置是否为空,如果为空直接进行存放Node节点。如果不为空,需要遍历链表或者红黑树,去判断是否存在相同的key,如果不同则插入,相同则覆盖。
:8开始为尾插,8之前为头插(多线程扩容可能会导致链表出现死循环的问题)

插入新节点后

3对数组的元素进行计数,当数组当中的元素数量大于负载因子与容量的乘积时,会触发扩容机制,两倍的扩容速度,扩容过程当中存在对元素桶索引的重新分配问题
:在jdk7之前会使用(2n-1)&hash重新算一遍桶索引的位置(n为原数组长度)
:但是在jdk8开始,将(2n-1)&hash进行拆分,拆成(n-1)&hash+n&hash=原索引位置+n&hash,在判断过程当中呢,实现对n&hash的计算即可,判断计算是否为零,为零则保留原索引,不为零则在原索引的基础之上加上旧数组长度,接着移动就简单了,将原先的链表拆分为两个临时链表,后续直接一次性挂载即可。

4判断是否需要树化,先判断链表长度,在链表长度达到8的条件下,判断数组长度是否达到64,达到就将链表树化,没达到64就以2倍的速度进行扩容。#如果再来一次,你还会选择这个工作吗?##牛客创作赏金赛##牛客在线求职答疑中心#
全部评论
哇,你对HashMap的put方法了解得真详细呢!看来是个技术大牛呢~那我来考考你,你知道为什么在JDK 8中引入了红黑树来代替链表吗?这样做的优势是什么呢?嘿嘿,如果你愿意深入探讨的话,可以点击我的头像,咱们私信聊聊哦!😄 至于你的问题,我简单总结一下: 1. 哈希扰动是为了减少哈希冲突。 2. JDK 8之前是头插法,之后改为尾插法,避免了多线程下的死循环问题。 3. 扩容时,JDK 8优化了重新计算桶索引的方法,减少了计算量。 4. 链表长度达到8且数组长度达到64时,链表会树化,提高查询效率。 希望我的回答对你有帮助!如果想继续探讨,记得私信我哦!🐮💬
点赞 回复 分享
发布于 08-16 22:28 AI生成

相关推荐

一面(八股+项目,30分钟):自我介绍Java的数据类型有哪些?String s = new String(“abc”)会涉及哪些空间?String a=“123”和String b=new String(”123“),他们的==会返回什么?arrayList和linkedList有什么区别?如果是双向链表,arrayList和linkedList读取头尾节点的效率有什么区别?hashmap在jdk1.7和jdk1.8有什么区别?为什么要用红黑树?讲一下你最近做的项目吧你的文件存储器部署在哪?你刚刚说动态切换文件存储器,我如果想把a存储器上的数据下载到b上该怎么办?如果不用中间节点呢?Jenkins自动打包部署怎么做的?jenkins的数据怎么持久化的?部署在哪?你Jenkins用的root还是用户?Jenkins部署在哪?你用的什么数据库?表是自己建的吗,还是开源?mysql也是部署在云服务器上的吗?mysql的用户权限你有没有了解?mysql是怎么做到管理用户权限的?最后问一个问题,left jion和inner jion有什么区别?有了解jion隐藏的形式吗?mysql列改行有没有了解?反问:我可以了解一下公司的业务吗?(招标投标)您觉得我今天的面试表现怎么样?(作为实习生来说,已经非常可以了)您觉得我有哪些地方需要改进的?(各个领域的知识点都要了解一下)我如果有幸入职,我会接触到什么?需要学习哪些技术栈吗?(你学习的东西跟我们企业是非常匹配的,比如SpringCloud Alibaba,生态,中间件)一共有几轮面试?(我后面应该还有一轮)最后面试官问了一下:你了解我们公司的地址吗?HR应该跟你说了吧,对秦皇岛
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务