HashMap

实现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.  

原文地址:https://www.cnblogs.com/mznsndy/p/11605753.html