HashMap(底层数据结构,1.7和1.8有何不同)

Java HashMap在1.7和1.8中有所不同,1.7使用数组+链表,而1.8引入了红黑树。当链表长度超过8时,会转换为红黑树以优化性能,降低长链表对HashMap的影响。树化阈值为8是基于概率计算,确保树化发生几率较小。当树元素少于6个时,会在特定操作下退化回链表。红黑树的引入主要是为了平衡查找效率和内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 底层数据结构,1.7和1.8有何不同?
    在这里插入图片描述

      1.7 数组+链表
      1.8 数组+(链表|红黑树)——当链表中元素比较多时,链表会转换成红黑树,红黑树中元素减少了,也会退回为链表

  • 为何要用红黑树,为何一上来不树化(数组+链表,只有当链表长度超过一个阈值之后,才会转换成红黑树),树化阈值(链表长度超过一个阈值之后)为何是8,何时会树化(是不是一超过这个阈值,就立马变成红黑树,还是有其它的条件呢),何时会退化为链表?
    红黑树特点左子树的节点元素比根节点元素小,右子树的节点元素比根节点元素大

    a. 为何要用红黑树:
      1.7中如果链表太长,会影响整个HashMap的性能,1.8引入红黑树之后,在链表比较长的时候,它会对HashMap的性能没有太大的影响。

    b. 何时树化:
      1. 链表长度超过阈值8;
      2. 整个数组长度大于等于64;

    c. 为何一上来不树化:
      红黑树用来避免DoS攻击,防止链表超长时性能下降,树化应当是偶然现象;
      在链表比较短时,链表的性能要比红黑树的性能好,并且红黑树占用的内存比较多;只有链表比较长的情况下,才会远远不如红黑树,如非必要,尽量还是使用链表;

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

    c. 退化情况
      1. 在扩容时如果拆分树时,树元素个数<=6 则会退化链表
      2. remove树节点时,若root、root.left、root.right、root.left.left有一个为null,也会退化为链表在remove之前检查,root:根节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值