Java常见问题之HashMap扩容、树化、死链

本文详细探讨了Java HashMap中的关键问题,包括如何解决Hash冲突,何时进行扩容和树化,以及为什么选择特定的阈值。文章还分析了1.7和1.8版本的区别,如头插法导致的并发扩容死链问题,以及1.8版本引入的红黑树优化。
摘要由CSDN通过智能技术生成

写在前边

  • HashMap属于比较常用的数据结构了,面试过程中也经常会被问到,本篇就知识点,展开问答式分析,重点聊聊hash冲突、扩容死链、容量为2的n次方、1.7和1.8之间的区别等问题~

如何解决Hash冲突问题

扩容

条件

  1. 链表长度超过8

  2. 元素个数超过数组个数的75%

树化规则

条件

  1. 链表长度超过8

  2. 此时看看数组长度是否超过64,超过就进行树化,否则只是单纯扩容

为什么需要树化

其实一般正常的元素,都是不会超过阈值的,只有插入一堆重复的元素,hash值一样,才可能达到阈值,这个简称Dos攻击 而元素一旦多起来,链表查找的效率就远不及红黑树了

树化一定更好吗?

不是的,维护红黑树需要占用比链表更多的空间,而且当链表长度足够短的时候,链表查找的效率反而比红黑树更高??

为什么选择0.75和8

  • hash 值如果足够随机,则在 hash 表内按泊松分布,在负载因子 0.75 的情况下,长度超过 8 的链表出现概率是 0.00000006,树化阈值选择 8 就是为了让树化几率足够小

退化规则

扩容的时候链表长度<=6

remove节点的时候

root、root.left、root.right、root.left.left 有一个为 null ,也会退化为链表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值