当前位置: 代码网 > it编程>编程语言>Java > HashMap每次扩容为什么是2倍

HashMap每次扩容为什么是2倍

2024年11月25日 Java 我要评论
当hashmap在初始化没有指定容量的情况下,首次添加元素时,数组的容量为16;当超出阈值,数组容量为扩容为之前的2倍。为什么hashmap每次扩容都是之前的2倍?而不是像arraylist首次为10

当hashmap在初始化没有指定容量的情况下,首次添加元素时,数组的容量为16;当超出阈值,数组容量为扩容为之前的2倍。

为什么hashmap每次扩容都是之前的2倍?而不是像arraylist首次为10,后续为1.5倍呢?2倍不是很浪费空间吗?

hashmap的putval方法源码,如下图所示:

其中 n 为数组的长度,n - 1 为数组的最大索引值。(n - 1) & hash 的意思是将每个元素的key的hash值,与最大索引值-1进行相与操作,得出该元素在数组中的位置。hash是添加的元素进过哈希函数计算出来的值。

每次扩容后的数组长度如下表:

与运算的规则如下,只要有一个0,结果就是0;两个同时为1,结果才是1。

1 & 0 = 0
0 & 1 = 0
1 & 1 = 1
0 & 0 = 0

假如hashmap的容量不是2的n次幂,设容量为10,二进制为01010,(n-1)的二进制是01001,向里面添加同样的元素9,12,13,15,结果为:

可以看出,9,13,15得出的结果都是9,index相同,hash碰撞严重。

当hashmap的容量是16时,它的二进制是10000,(n-1)是15,二进制表示是01111,和hash值9,12,13,15进行与运算,计算结果如下:

还是9,12,13,15。可以看出,与运算后得出不同的值,使得添加的元素能够均匀分布在集合中不同的位置上,避免hash碰撞。

综上所述,hashmap计算添加元素的位置时,使用的位运算,这是高效的运算;

另外,hashmap的初始容量是2的n次幂,扩容也是2倍的形式进行扩容,是因为容量是2的n次幂,可以使得添加的元素均匀分布在hashmap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询速度降低!

到此这篇关于hashmap扩容为什么是2倍的文章就介绍到这了,更多相关hashmap扩容2倍内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com