码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap

时间:2019-09-29 09:14:50      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:键值对   分布   而不是   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.  

HashMap

标签:键值对   分布   而不是   aci   shc   code   数组   情况下   val   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!