必知必会--HashMap容量细节

前言

HashMap作为Java中最常用的数据结构之一,在工作中使用HashMap的频率和你遇见NullPointException一样多。作为最常用的数据结构之一,我们都知道HashMap的容量为2次幂。当被问到为什么是2次幂时,大家应该都能回答出来,是为了将结点均匀分散到数组中。当容量为2次幂能够均匀分散结点,3次幂为什么不能?HashMap中如何解决Hash碰撞?在HashMap的构造方法中可以传入容量,如果传入非2次幂怎么办?看完这篇文章你会解决其中的疑问。

ps:代码来源于JDK1.8

正文

HashMap底层数据结构为数组+链表+红黑树当我们向HashMap中插入一个对象,HashMap会通过Index映射算法得到该对象插入到数组的下标index。此时HashMap分辨这个位置有没有值以及值类型。如果index没有值,将当前对象放入当前位置。如果index有值,判断对象的key是否与该值的key相等(key的hash值相等以及key本身相等),如果key相等则覆盖该值,如果key不相等,将对象插入该值的尾部(链表和红黑树不同的处理)。

Index映射算法

int index = (n - 1) & hash

对于为什么采用&运算而不是%。1:&运算比%运算效率高很多;2:当n为2次幂,(n-1)&hash等同于hash%n。

如果HashMap的容量不是2次幂

假设当前HashMap的初始容量为17,即n等于17时。

1:n=17则n-1=16,16的二进制表示为0010000。

2:如果我现在向HashMap中插入两个键值对,key1=A,Key2=B。假设通过Hash算法得知A的hash值为1010110,B的Hash值为0110000

3:分别算出key等于A,B时所映射的index

0010000  0010000

1010110  01100

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值