HashMap底层扩容机制是2倍的原理

HashMap底层扩容2倍原理

总所周知,获取分配的两种计算公式:
内存中获取分区位置:hash(key.hashCode) % (length - 1)
HashMap获取数据存储的位置:hash(key.hashCode) & (length - 1)

为何HashMap底层扩容机制是两倍?
那么先来看一下,不是扩容两倍的情况
通过key的HashCode值在进行hash散列算法后得到均匀的二进制
此时假设数组的长度为5
根据数据存储的位置计算出索引(0,1,2,3,4,)

//hash(key.hashCode) 0101 0101(因无法确认key的值,这里取随机数)
//                   &
//(length - 1)       0000 0100
------------------------------------------------------
//                   0000 0100 => 分区索引选择结果只有4,0 两种情况

解析:
无论hashcode的值是多少,只有可能取到4和0两个值,因为length-1是固定值,这种情况下,1,2,3都无法取到,总共有五个索引,但只能取到其中两个,这就造成数据倾斜,大量的数据形成链表,浪费内存空间

HashMapJava中常用的一种数据结构,它基于哈希表实现。HashMap底层数组链表(或红黑树)构成,主要包括数组链表和红黑树三个部分。 1. 数组HashMap内部维护了一个Node类型的数组,这个数组实际上是一个哈希表,用于存储键值对。数组的每个元素称为桶(bucket),每个桶可以存储一个或多个键值对。 2. 链表:当多个键值对被哈希到同一个桶时,它们会以链表的形式存储在该桶中。链表中的每个节点都包含了键、值以及指向下一个节点的指针。 3. 红黑树:为了提高HashMap的性能,在JDK1.8版本中引入了红黑树。当某个桶中的链表长度超过一定阈值(默认为8)时,链表将会转换为红黑树,以减少查找时间复杂度。 扩容机制是指当HashMap中存储的键值对数量超过了负载因子(默认为0.75)与当前数组容量的乘积时,HashMap会自动进行扩容操作。扩容后,HashMap会重新计算每个键值对在新数组中的位置,并将其放入新的桶中。 扩容过程中,HashMap会创建一个新的两大小的数组,并将原来数组中的元素重新分配到新数组中。这个过程涉及到重新哈希计算,即对键的哈希值进行重新计算,并通过取模运算确定新数组中的位置。在新数组中,键值对的顺序可能会发生改变。 扩容过程可能会比较耗时,因为需要重新计算哈希值和重新分配元素。但是扩容操作能够保证哈希表的负载因子维持在一个较低的水平,从而提高HashMap的性能和效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值