初探HashMap的put方法

hashmap的put方法的实现原理,首先table是否为空,如果table为空的话,那么他会进行这个扩容,第一次的话hashmap他默认是16的一个容量,那么如果不为空的话,他就会计算这个数组的一个下标,那么数组下标的一个计算方式是需要用到我们的这个hashcode,以及table.length-1进行一个&操作,那么如果key存在呢?我们hashmap里边会走一个直接覆盖的一个操作,那么如果key不存在的,而这个时候呢,对于jdk1.7来说,其实没有太多的一个操作,那么它就会直接而进行判断,因为他确定下边要么是链表啊,要么就是有一个槽位,那么但是对于这个jdk1.8来说,他还需要进行一个判断,是不是当前桶位上是这个树结构,或者是这个链表结构.如是这个链表结构的话,它在源码层面,他还要判断,我添加上这一个元素之后,它是不是会导致这个从链表转化为这个红黑树,这是他的一个前面的一个操作. 那么对于这个添加来说,它也会涉及到一个实质性的问题就是hashmap的一个扩容,就是说当我们的这个hashmap,当然了,这需要看hashmap他里边的一个负载因子,还有他的当前的一个容量,基本上负载因子的话,默认情况下是0.75,也就是说,如果达到这个阈值的话,他会选择一个扩容,那么在细节上来说的话,hashmap插入数据的时候,他put方法里边的是有四个参数,那么着重说一下第1个参数. 第1个参数其实是这个哈希值,那么哈希值他是通过这个key的hashcode"异或"自身右移16位这样得到的一个值{(h = key.hashCode()) ^ (h >>> 16);},那么拿到这个值之后,他会对跟这个table,也就是数组的一个长度,hashmap的一个size,size减一,也就是二的n次方减一进行&操作,然后定位数组里边,他的一个槽位,那么定位完槽位之后呢,才是接下来去判断它是链表一个数组,当然这是说的jdk1.8的这个情况啊,那么这边他其实是涉及到一个扰动的一个处理,那么就是hashcode,他的一个计算方式,它是一个自身"异或"自身右移16位,这样得出来的一个值,这样的话其实就完成了他的一个寻址,剩下的其实就是一个内存空间的一个开辟,在扩容的时候已经开辟过了,然后就是我理解的put方法实现原理.

在看源码之前看了一个大佬写的一篇解释put方法的文章,读了之后很多点都不理解,带着问题去看源码,并结合大佬的文章,辅助我去理解,这是在现在的知识认知量理解的程度,对知识掌握量变大之后还会再次深入理解底层的结构!欢迎各位给出不同意见并指点,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GH无霸哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值