本文讲解的HashMap以及源代码都是基于JDK1.8
改变链表结构的默认条件:1. 单链表中的元素个数大于8时 2. 桶数组中的元素个数大于64时 【二者满足其一即可】
比较简单的描述,详细的可以看put方法流程图以存储该键值对为例
注意点:JDK1.7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置,但是JDK1.8不会倒置 (具体可以看下文的Resize方法讲解)先了解几个源码变量:
必须为2的n次方的HashMap非常规设计目的:为了在取模 (路由算法) 和扩容时做优化,同时为了减少冲突,HashMap定位哈希桶索引位置时,也加入了 (扰动函数) 高位参与运算的过程。
路由算法优化:因为要提升性能 &比%快,所以只有当容量n为2的n次方时,(n - 1) & hash == hash % (n - 1) 才成立!
扩容优化:扩容的时候方便数据迁移。(具体如何方便后文有讲)
小结:扩容是一个特别耗性能的操作,所以在创建hashmap的时候尽量估算capacity容量先认识以下变量(和前面扩容认识的变量一样)
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |