标签:键值对 分布 而不是 aci shc code 数组 情况下 val
实现Map
存储<key,value>的集合,每个键值对叫做Entry
HashMap每一个元素的初始值都是Null
1.put方法
1)需要利用哈希函数来确定Entry的插入位置index=Hash("key")
2)HashMap的长度是有限的,当插入的Entry越来越多时,会出现index冲突的情况,
HashMap的每个index上的元素同时也是一个链表的头节点,新Entry映射到冲突的index上时,会通过头插法插入链表,
(发明者认为后插入的Entry被查找的可能性更大)
2.get方法
把输入的key做一次Hash映射得到对应的index,由于同一个index可能匹配多个Entry,需要顺着头节点依次向下查找
3.HashMap默认长度是16,每次自动扩展或是初始化,长度必须是2的幂,
index=HashCode(key)&(Length-1)
1)为什么是位运算而不是取模?
Hash算法最终得到的index结果完全取决于key的HashCode的后几位(length-1位),&效果上等同于取模,还提高了性能
2)为什么长度是16或2的幂?
长度16或是2的幂,Length-1的值所有二进制位全是1,index结果等同于HashCode后几位,
只要输入的HashCode本身均匀分布,Hash算法的结果就是均匀分布的
4.Resize
HashMap的容量是有限的,当元素多次插入,HashMap达到一定的饱和度,key映射位置发生冲突的几率逐渐提高,
此时,HashMap需要扩展它的长度,进行Resize
1).影响Resize发生的因素有两个
①Capacity 默认16
②LoadFactor 默认0.75f
衡量是否进行Resize的条件:HashMap.size>=Capacity*LoadFacor
2).Resize步骤
①扩容
创建一个新的Entry数组,长度是原来的2倍
②ReHash
遍历原Entry数组,重新Hash到新数组
4.高并发下的HashMap
ReHash在并发情况下可能形成链表环,陷入死循环。在高并发场景下,通常采用ConcurrentHashMap.
标签:键值对 分布 而不是 aci shc code 数组 情况下 val
原文地址:https://www.cnblogs.com/mznsndy/p/11605753.html