HashMap集合源码以及底层结构解析(何时数组+单项链表变为数组+红黑二叉树)

本文详细探讨了HashMap集合的源码和底层结构。在首次添加元素时,HashMap会初始化为容量16,临界值12。当元素数量超过临界值或单链表节点数超过8时,HashMap会进行扩容。特别是当容量达到64且链表长度达到8时,HashMap的底层结构将从数组+链表转变为数组+红黑树,以优化查找效率。
摘要由CSDN通过智能技术生成

当开始创建集合时,调用构造器,此时会对加载因子初始化


当首次调用put方法添加元素时


*注意:这里的hash值不是原始值返回的,而是算出key的hash值后和0无符号右移16位后的值进行异或运算


*然后进入resize方法



到这里resize方法就对table进行了初始化,容量16,临界值12



在后面的添加过程中,可能会用到下面else里面的添加方法,这里就不细说了,可以简单看下,然后记住后面的小结部分内容好好体会


小结:首次添加元素时,初始化的三个参数分别为:临界值12(16*0.75),数组长度(文中的容量)16以及加载因子0.75。当添加的元素的hash值与之前的有重复时,会进行内容对比(equals),如果一样,则会覆盖之前的内容,不一样则会加到上个元素的后面。

情况一:当总共元素个数大于临界值时,会以2倍的数量对数组容量扩容。

情况二:当单个链表中的元素个数大于8时,会以2倍的数量对数组容量扩容(每增加1个就会扩容一次)。

注意:当1、数组容量达到64。2、单向链表的元素个数达到8个时,HashMap底层结构会由【数组+单向链表】变成【数组+红黑二叉树】

极限情况:当所有的元素hash值都相同,都放到了一个链表,当放到第9个时,容量变为32,当放入第10个时,容量变为64,当放到第11个时,底层结构开始发生变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值