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

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 核心知识,扰动函数、负载因子、扩容链表拆分)