HashMap源码分析初始化和put(1)

文章详细分析了HashMap的初始化过程,指出默认数组长度为16,阀值为12。在put时计算hash值,通过位运算确定索引,并介绍了在数组长度为2的N次幂这一特性。当size超过阈值时,会触发扩容。同时,文章提及了HashMap如何转换为链表和红黑树,并提示了LinkedHashMap用于保留插入顺序。
摘要由CSDN通过智能技术生成

这章简单分析一下HashMap源码 初始化和put源码
后面我会接着给大家分析 HashMap如何从数组 转为链表 在转为红黑树 和扩容
在了解红黑树之前 需要先了解二叉树的数据结构 二叉搜索树 之前的文章我有介绍过二叉搜索树的代码 添加和查找 但是删除代码有点问题 大家理解二叉树的原理就行
好了废话不多说 直接上干货
在这里插入图片描述
首先HashMap初始化 默认16位数组长度 阀值为数组长度*0.7 得12 数组在put的时候才会初始化,所以刚开始只记录 loadFactor 和threshold

在这里插入图片描述
我们可以看到上面这个方法 这个方法可以保证hashMap的大小永远为2的N次幂最进阶我们设置的值 |包含了^和&的取值
在这里插入图片描述进行put的时候 首先计算hash值 首先根据key的hashCode求出hash,然后hash右移16位与hash原始值相比,得出中间位
在这里插入图片描述可以看到进行了^运算 比如二进制1001 ^ 1000 将会得出0001 hash值为1
在这里插入图片描述首先为们可以看到 如果table为空 进行初始化

在这里插入图片描述
拿到数组的长度oldcap和hashMap的threshold如果初始化指定了长度则为指定的长度这个长度为2的N次幂最接近当前设置的大小 比如设置为7 则长度为8 ,如果没有指定则为0 默认为16
然后初始化完全返回newTab
之后在回到刚才
在这里插入图片描述
根据数组长度n-1&hash 得出索引值 比如101011 001011 为 001011 然后存入数组
在这里插入图片描述
最后执行size+1 比较是否超过阀值 我们可以看到 afterNodeInsertion(evict)这个方法是代表是否需要保留插入顺序 如果使用的话 我们就需要使用LinkedHashMap

暂时先简单介绍到这里 HashMap初始化和put

后面会相续介绍HashMap扩容和链表、红黑树的产生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值