java面试题:hashMap扩容机制

 

初始容量和加载因子:

 

HashMap在初始化时有一个默认的初始容量(capacity),通常是16。这个容量也可以在创建HashMap时通过构造函数指定。

HashMap还有一个加载因子(load factor),这是一个表示HashMap填充程度的浮点数。当HashMap中的元素数量达到容量与加载因子的乘积时,就会触发扩容操作。默认的加载因子是0.75。

 

扩容时机:

 

HashMap使用的是懒加载机制,即在创建HashMap对象后,如果不进行put方法插入元素,HashMap并不会去初始化或扩容其内部数组(table)。

当进行put操作并发现HashMap中的元素数量达到了容量与加载因子的乘积时,就会触发扩容操作。

 

扩容步骤:

 

创建一个新的Entry空数组(即新的哈希表),其长度是原数组的两倍。

遍历原Entry数组(即原哈希表),把所有的Entry重新计算哈希值并放入新的数组中。这是因为长度扩大以后,哈希的规则也随之改变。

 

重新计算哈希值和索引:

 

在扩容过程中,需要重新计算每个元素的哈希值和在新数组中的索引。HashMap使用键的哈希码来计算索引值,通常是通过取模运算(index = hashCode % arrayLength)来实现的。但在HashMap中,为了提高效率,当数组长度为2的幂时,会采用(n - 1) & hash的方式来计算索引,其中n为数组长度。

 

调整元素位置:

 

在扩容后的新数组中,元素的索引位置可能会发生变化。具体地,如果某个元素的哈希值的某一位(例如最低位)在扩容前为0,则在新数组中其索引位置不变;如果为1,则索引位置变为原索引的两倍。

 

更新容量和阈值:

 

扩容完成后,HashMap的容量变为原来的两倍,同时阈值(即容量与加载因子的乘积)也相应地更新为新的值。

 

并发问题:

 

需要注意的是,在多线程环境下使用HashMap可能会导致数据不一致和条件竞争的问题。因此,在多线程环境下应该使用ConcurrentHashMap等线程安全的Map实现。

 

总结来说,HashMap的扩容机制是为了保持其在负载因子范围内的性能而设计的。当HashMap中的元素数量超过容量与加载因子的乘积时,就会触发扩容操作,通过创建一个新的、容量更大的数组来重新调整HashMap的大小和内部结构。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值