21.2谈一下 hashMap 中什么时候需要进行扩容,扩容 resize() 又是如何实现的?

调用场景:

1.初始化数组 table
2.当数组 table 的 size 达到阙值时进行扩容

实现过程:

<0>0
进行初始化进行扩容,扩容成两倍
调用了无参构造器没有调用无参构造器将元素重新进行与运算复制到新的散列表中
使用默认的大小和阙值<阈值 12使用构造函数中初始化的容量
容量是 tableSizefor 计算后的 2 的次幂数

通过判断旧数组的容量是否大于 0 来判断数组是否初始化过。
如果小于 0:进行初始化,判断是否调用无参构造器。

如果调用了无参构造器: 使用默认的大小和阙值<阈值 12.
阀值=默认大小为 16 乘以负载因子 0.75。

如果没有调用无参构造器: 使用构造函数中初始化的容量, 当然这个容量是经过 tableSizefor 计算后的 2 的次幂数) 。

如果大于 0: 进行扩容,扩容成两倍(小于最大值的情况下),之后在进行将元素重新进行与运算复制到新的散列表中。

概括的讲:

扩容需要重新分配一个新数组,新数组是老数组的 2 倍长,然后遍历整个老结构,把所有的元素挨个重新 hash 分配到新结构中去。

PS:可见底层数据结构用到了数组,到最后会因为容量问题都需要进行扩容操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值