栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

初探HashMap的put方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初探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方法的文章,读了之后很多点都不理解,带着问题去看源码,并结合大佬的文章,辅助我去理解,这是在现在的知识认知量理解的程度,对知识掌握量变大之后还会再次深入理解底层的结构!欢迎各位给出不同意见并指点,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号