理论上,HashMap的链表是有可能性超过8的,比如长度为9

本文探讨了HashMap在JDK8之前的链表结构,解释了为何在链表长度达到8时可能转为红黑树,以及这种转换的条件。通过理论分析和实验验证,指出链表长度超过8并非绝对,而是取决于hash值和数组长度等因素。
摘要由CSDN通过智能技术生成

HashMap的数据结构

在jdk8之前,HashMap的数据结构还是以数组加链表的方式存储,到8之后呢,由于链表需要迭代查询,链表就需要转红黑树,从而实现时间复杂度上的提升。尽管链表的长度越长,hash冲突概率越小,也无法阻挡官方为了这个细节做出结构上的变化。所以当链表长度达到8时会转成红黑树,但并不是绝对的。

HashMap为什么会快

其实这是一个老生长谈的问题:

  1. 合理的数据结构:数组、链表、红黑树
  2. 采用hash算法:第一次放值时,将key的hashcode高16位和低16位做异或求出hash值,和数组最大下标与运算,当再次扩容时使用hash值与旧数组长度与运算,求出新的下标值,存在两种可能性,与运算为0,还是旧数组下标位置,是1,为旧数组下标位置+旧数组长度
  3. 底层采用位运算:不管是求下标位置还是扩容计算都采用位运算,这也是为什么数组长度为2的n次方的原因之一。

何时转红黑树

当链表长度超过8时,会调用treeifyBin方法,从这个方法可以看出转红黑树时还需要保证数组长度大于等于64,否则会进行resize。

final void treeifyBin(Node<K,V>[] tab, int hash) {
   
        int n, index; Node<K,V> e;
        if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
            resize();
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值