zoukankan      html  css  js  c++  java
  • 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.  

  • 相关阅读:
    centos7安装jdk8
    centos7安装mysql5.7.31
    docker打包,运行springboot
    centos7安装docker
    ps学习记录
    Html的学习(二)
    tensorflow C++接口调用图像分类pb模型代码
    tensorflow C++接口调用目标检测pb模型代码
    ubuntu14 编译tensorflow C++ 接口
    Python opencv计算批量图片的BGR各自的均值
  • 原文地址:https://www.cnblogs.com/mznsndy/p/11605753.html
Copyright © 2011-2022 走看看