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算法做了优化,其算法逻辑不变,实现方式有所变化,更改为字节数组后存储字符串所需的内存会进一步变小了。
预习
- 链表树化的条件,转换成什么树?
- 树转链表的条件?
- 树的扩容?