Java Hashmap如何扩容?

263 篇文章 1 订阅

利用resize()方法进行扩容,整个扩容过程是需要把旧表每个键进行重哈希然后写入扩容后的新表中。java hashmap默认初始容量是16,每次扩容是将容量扩大为两倍。而且hashmap容量要时刻保持2的幂次方,因为我们计算出hashcode之后,还要对length取余,从而得到hashmap index的位置。但是我们用另外一种位运算的方式得到这个位置,速度更快,只是要求length必须为2的幂次方,因此 hashmap的容量就一直保持为2的幂次方。

HashMap 容量为2次幂的原因,就是为了数据的的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。
那么是如何保证均匀分布能?因为我们每次将key放的为你之是i=(n-1)& hash,其中 n 代表数组的长度,即map的容量。当n为2的幂次方时,(n-1)& hash 的值是均匀分布的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的HashMap是一种非常常用的数据结构,它可以存储键值对,并通过键快速地获取对应的值。为了提高HashMap的性能,Java在实现中采用了哈希表的数据结构,通过把键hash处理成一个索引,从而进行快速查找。 在HashMap中,扩容是一种非常重要的机制。当HashMap中的键值对数量增大到一定程度时,此时HashMap中的存储桶已经被高效利用。如果继续往里面添加更多元素,那么Hash碰撞的情况就会越来越多。因此,需要将HashMap的容量扩大,监控元素数量,并将所有元素重新进行哈希计算,以确保它们被正确的存储在新的存储桶中。 在Java8之前,HashMap的默认初始化容量是16,每增加一倍,扩容操作就会被触发。具体来说,当HashMap中的元素数量大于等于当前容量的“负载因子”乘以容量时,就需要进行扩容操作。负载因子是指HashMap在达到容量界限之前允许的最大元素比例,默认为0.75。 Java8中的HashMap扩容机制有所改进。当前的扩容机制采用了红黑树的机制,当某个桶中的元素数量达到阈值(8),且存储桶的数量大于等于64时,这些元素将被转换为红黑树,以提高查询效率。同时,在扩容过程中,将会把链表或红黑树中的节点重新映射到相应的新桶中,从而保持哈希表的连续性。 总结来说,HashMap扩容机制是为了防止Hash碰撞的发生并且保证HashMap的性能,它通过将每个元素重新进行哈希计算并重新映射到新的存储桶中来实现扩容。 在Java8之前,扩容机制会将链表长度过长的桶转换为红黑树,以提高查询效率。在Java8中,当某个桶中的元素数量达到阈值时,并且HashMap中存储桶数量达到一定程度时,这些元素将被转换为红黑树,以继续提高查询效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech In Pieces

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值