【2025大数据秋招】Java中的HashMap原理细节揭秘

前言

大家好,我是准备2025年秋招的一枚小硕clown,主攻大数据开发,欢迎大家交流大数据!祝大家天天开心!这一期我们的主题是HashMap的原理:

HashMap变化

HashMap在jdk从1.8之后发生了改变,具体改变如下:
前:在【1.8之前】中hashmap是由数组-链表的数据结构组成的,但是之后是由【数组-链表-红黑树】所组成的。
后:1.8之前首先会创建一个长度为16的entry数组,1.8以后初始化对象不是【初始化】的时候创建数组,而是在使用put操作的时候创建一个长度为16的Node数组。

HashMap的插入操作

在jdk1.8之后,HashMap的插入即put操作,更改为初始插入的时候,首先调用的是hashcode的方法,通过函数计算出key的哈希值,接着通过哈希函数得出在数组中的下表(比如hash = (n-1) & hash)。如果此时没有出现【哈希碰撞】,那么我们将元素添加至计算的地方。

如果出现了哈希碰撞,那么我们会比较这个元素和索引处元素的key是否是相等的(调用equals方法),如果相等那么就替代该元素的值,如果链表当中的元素的key都不相等,那么开辟出一个节点存储。

补充:出现哈希碰撞的时候有几种方法可以解决?

1、拉链法
2、地址探测法
3、再哈希法(Rehashing):当发生哈希碰撞时,使用另一个哈希函数重新计算冲突项的哈希值,并将其放入新的位置。这种方法可能需要多次重新哈希,直到找到一个空槽位。
4、完全散列(Perfect Hashing):对于一组已知的输入值,可以使用完全散列技术构建一个无冲突的哈希函数。这种方法适用于静态数据集,但对于动态数据集的更新可能较为复杂。

HashMap的扩容过程

1、当HashMap当中的元素个数超过了【数组长度n * 负载因子】时,就会进行数组扩容,默认情况下,如果初始化了的数组的长度是16,那么负载因子一般为0.75,也就是超过元素个数12的时候,就会进行扩容。
2、当链表的容量超过8且数组长度超过64的时候就会将链表转换为红黑树,原理是HashMap默认的负载因子是0.75,因为根据泊松分布,放入数据为数组长度的50%时,一个桶下超过8个结点的概率为亿分之六(基本上不可能)因此,负载因子默认为0.75,链表转红黑树临界值为8个结点,事实上,负载因子取0.6-0.8结果变化不大
3、扩容为两倍,这表示在前边的hash = (n-1) & hash中,n做了>>1的操作,那么就是多了1位,即当如果hash的结果为0,表示索引下标不变,为1的时候则变为原位置+旧容量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值