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.  

  • 相关阅读:
    Vue单元测试Karma+Mocha
    Vue将px转化为rem适配移动端
    vscode格式化代码插件Beautify
    vue项目初始化时npm run dev报错webpack-dev-server解决方法
    在vue项目中引入jquery
    vue全局使用axios插件请求ajax
    vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别
    快速搭建Vue项目
    vue mand-mobile按2.0文档默认安装的是1.6.8版本
    vue mandmobile ui实现三列列表的方法
  • 原文地址:https://www.cnblogs.com/mznsndy/p/11605753.html
Copyright © 2011-2022 走看看