栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

  • 底层数据结构,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.lfet.left有一个为null,也会退化为链表(在remove之前检查,root:根节点)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号