HashMap扩容 JDK1.8的rehash算法优化

本文介绍了HashMap在JDK1.8中的优化,包括当链表达到一定长度转为红黑树以提高遍历效率,以及在扩容时的rehash算法如何提升性能。在扩容过程中,通过对n-1二进制位的变化分析,解释了键值对在新数组中的两种可能位置,从而降低了寻址的时间复杂度。
摘要由CSDN通过智能技术生成

HashMap的底层数据结构是数组,如果发生了hash冲突的话,会采用拉链法,将数组中的节点挂载成一个链表,JDK1.8之后如果链表节点数量太多,超过阈值8的话,就会转化为红黑树。因为HashMap在遍历key的时候,如果是链表的话,会循环遍历整个链表,时间复杂度是O(n),效率较低,使用红黑树的话,时间复杂度是O(logn),可以有效提升效率

好像有点跑题了,主要是想说HashMap的底层其实是一个数组,既然是一个数组,必然长度是固定的,也就一定存在扩容的问题。在JDK1.7的时候,是将数组扩容为两倍,然后将HashMap中所有的key重新进行hash寻址然后再放入到新的位置

在JDK1.8的时候,扩容同样是按照两倍的大小进行扩容,同时将hash算法、hash寻址算法进行了优化(可以参考我的这篇文章 HashMap简析)rehash算法,也就是扩容后重新为里面的键值对寻址的算法也优化了
举个例子,首先你得知道hash寻址算法是 index =(n - 1) & hash,n是数组的容量,hash是key的hash值,这里以默认数组长度16来计算
1
上面进行hash寻址之后,就可以得到key的位置index是12(1100的十进制)

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值