美文网首页
HashMap 核心知识,扰动函数、负载因子、扩容链表拆分

HashMap 核心知识,扰动函数、负载因子、扩容链表拆分

作者: Jinweb | 来源:发表于2022-08-27 08:04 被阅读0次

    HashMap核心知识,扰动函数、负载因子、扩容链表拆分

    上次预习

    • 简单实现HashMap
    • 扰动函数 的意义
    • 初始化容量、负载因子 初始值的认识
    • 扩容方法 解释
    • 链表和红黑树 未说明
    • 未来的JDK版本(截止JDK18)神奇的对HashMap没有更新,这也说明了目前为止,咱们学好JDK7 ,8的HashMap 足以应对
    • TreeMap在JDK15 进行拓展了一些方法

    学习中的问题

    • 扩容元素拆分

    问题解决

    • HashMap.java:708 如果老链表的下标对应的值有 下一个也有值 且非树结构的时候发生的扩容算法, 然后一些数组链表太多了触发的扩容
      这边问题点其实是hashMap 怎么进行拆分的,如何保证均匀的,这边使用的算法核心是
    (e.hash & oldCap) == 0
    

    对应的也区分开两条链表,分别叫做高位链,低位链,
    低位链 则上述表达式为真,保留在原来位置,高位链则上述表达式为假,会将 原链表位置 + 扩容长度 作为新链表的下标

    后期JDK版本相关内容扩展

    • 后续没有对HashMap再继续更新
    • JDK7版本的HashMap与JDK8的差别在于散列算法,扩容成新map算法,hash冲突后的数据结构,链表插入位置
    • JDK7版本的HashMap的相同点在于容量,阈值,负载因子,扩容大小

    总结

    • JDK8的HashMap针对于散列算法和扩容算法将HashMap的效率在JDK7的基础上做了做了很大的优化
    • JDK9 对String的HashCode算法做了优化,其算法逻辑不变,实现方式有所变化,更改为字节数组后存储字符串所需的内存会进一步变小了。

    预习

    • 链表树化的条件,转换成什么树?
    • 树转链表的条件?
    • 树的扩容?

    相关文章

      网友评论

          本文标题:HashMap 核心知识,扰动函数、负载因子、扩容链表拆分

          本文链接:https://www.haomeiwen.com/subject/rstfnrtx.html