Java基础——HashMap扩容2倍

探讨HashMap在进行put操作时的扩容机制,分析为何扩容倍数选择2的原因。通过对比不同扩容方式下hash桶坐标的计算,解释为何2倍扩容能保证散列均匀,避免hash桶资源浪费。

HashMap扩容2倍

在HashMap中,执行put方法时,会对添加的key进行运算得出对应的hash值,再根据hash值计算得出对应的hash桶坐标节点tab[i]。

if ((p = tab[i = (n - 1) & hash]) == null)
  tab[i] = newNode(hash, key, value, null);

其中i = (n-1) & hash,n为tab数组长度,默认初始值为16。

扩容倍数为2,则tab长度一定为偶数,所以n-1位奇数,奇数的二进制形式最后一位一定是1,那么与hash进行与运算时得到的可能为奇数也可能为偶数,散列较为均匀。

如果扩容倍数不为2,可能会出现tab长度为奇数的情况,当tab长度为奇数时,n-1一定为偶数,奇数的二进制形式最后一位一定是0,那么与hash进行与运算时得到的一定是偶数,会有一半的hash桶没有得到利用。

举例:tab长度为25,扩容2倍后为50,50的二进制:110010, n-1=110010-1=110001

110001 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110001 & hash(100101) = 100001(十进制为33,奇数)散列后为奇数

结果的奇偶由hash值来决定。

                      tab长度为25,扩容2倍+1后为51,二进制:110011,n-1=110011-1=110010

110010 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110010 & hash(100101) =100000(十进制为32,偶数)散列后为偶数

结果一定是偶数,与hash无关,则i为奇数的hash桶无法被利用到。

### HashMap扩容时底层数数组扩大数 在Java中,`HashMap`的扩容机制是为了应对不断增长的数据量而设计的一种动态调整策略。每当`HashMap`中的元素数量达到一定阈值(即容量乘以加载因子的结果),就会触发扩容操作。 扩容的核心逻辑之一就是将原有的底层数组扩大一定的数。根据提供的参考资料以及官方文档描述,在`HashMap`的实现中,每次扩容时,底层数组的大小都会变为原来的两倍[^2]。这种设计不仅简化了索引计算的过程,还能够有效减少哈希冲突的概率。 具体来说,当`HashMap`检测到需要扩容时,它会执行以下两个主要步骤: 1. **创建新数组**:构建一个新的数组实例,其长度为原数组长度的两倍2. **重分布数据**:通过重新计算每个键值对的哈希值及其对应的索引位置,将原有数据迁移到新的数组中。迁移过程中可能会涉及链表结构调整或红黑树转换的操作[^3]。 因此,可以总结得出结论——`HashMap`在扩容期间将其内部使用的底层数组尺寸放大至原先的两倍规模。 ```java // 示例代码展示简单的扩容过程模拟 public class HashMapResizeExample { public static void main(String[] args) { int oldCapacity = 16; // 初始容量假设为16 final float loadFactor = 0.75f; // 当前已存入元素的数量 int size = (int)(oldCapacity * loadFactor); if(size >= oldCapacity){ // 计算新容量 int newCapacity = oldCapacity << 1; // 左移一位相当于乘以2 System.out.println("Old Capacity: "+oldCapacity); System.out.println("New Capacity after resizing: "+newCapacity); } } } ``` 以上程序片段仅用于演示目的,并未完全体现实际`HashMap`类内的复杂细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值