hashmap8底层源码剖析1--构造以及put

本文详细探讨HashMap的构造过程,包括带参数和无参数构造,特别指出容量会调整为2的次幂。在put操作中,通过特定hash算法确保分布均匀,首次put时会触发扩容至16。如果数组已存在,根据hash值确定索引,相同key时更新值,不同key时可能插入链表或红黑树,当链表长度达到8会转为红黑树提高查询效率。
摘要由CSDN通过智能技术生成

以下内容第一遍全按照记忆来,会有一些不太全的地方。

1.首先构造有两种:①带参数构造,如hashmap(10),此时底层会将输入的参数进行多次位运算(转换成后几位全是1的,比如111,1111),扩容的时候就在二进制转化为10进制的时候再加上1即可。也就是说,会就近返回一个2的次幂,这个才是数组的大小。比如说传入10,会返回16,传入15也是16,传入17会返回32。以此类推。注意:此时仅仅只是将改容量大小赋值给threshold,并没有创造数组,也就是说不管你传入几,我都先跟你存着,等你第一次put元素进去的时候我再给创建数组

                               ②无参构造,内部什么也不做,仅仅只是定义一个负载因子,这个因子等于0.75,为什么等于0.75,因为这是开发团队大量实验出来的结果,这个能保证数组得到充分的利用。

2.第二步put方法:

①如果原本没有值得话

步骤1:首先会用hash算法去取得key对象的hash值,也就是用对象的hashcode的高位和低位进行位运算(将整个hashcode右移16位,在和原值进行异或),这种算法能够让最终得到的hash值更加分散,当然这个算法也是大量实验得出来的。

步骤2:判断当前数组是否为null,或者长度为0,如果是,会立马给数组进行扩容,并且直接扩容为16

步骤3:用得到的hash值与n-1进行&操作,得到最后的位数的二进制编码值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值