zoukankan      html  css  js  c++  java
  • 探寻hashmap

    Hashmap源码

    1、  构造器:

      a)获得默认数组大小:1>>4 :16

      b) 获得负载因子:0.75:衡量hashmap的空间使用程度

                            i.过大:使用空间更加充分,但是查找效率变低,即时间复杂度变大

                           ii.过小:hashmap数据过于稀疏,造成空间浪费,即空间复杂度变大

      c)创建数组

    2、  Put()方法:使用key的hash算法,计算出可key的存储的数组位置,确定key的位置后相应的value也会确定,如果数组位置已经有数值存在,则以第一个值为链头以链表形式存储。

    3、  Get()方法:计算出key的hashcode值,然后去寻找

    4、  Resize()方法:如果需要的存放的存储空间大于默认数组大小*负载因子的乘积,那么就发生扩容,扩大为原来的两倍

    5、  问题:

      a)为什么hashmap的容量总是2的次方

                            i.因为hashmap中有一个方法是h&table.length-1,这样可以减少碰撞概率。

                           ii.例子: 8&14  9&14 与  8&15  9&15 15不会发生碰撞 14会发生碰撞,这是一会我数学概率问题。

      b) 可以的话建议使用hashmap的clear方法循环使用hashmap

                            i.应为hashmap是强引用类型,原有不适使用的hashmap不会被jvm回收,可能造成内存泄露

     高并发的hashmap

    1、  情况(1.7):内部链表遭到破坏,发生链表成环,造成死循环,cpu飙升

    2、  解决:1.8 引入两个指针声明 确保顺序

    确保hashmap线程安全

    1、  方法

      a)使用collections.synchronizedmap方法

      b) 使用concurrenthashmap并发集合类代替

  • 相关阅读:
    Django-4
    Django-3
    博客中涉及的源码下载
    源码阅读系列:EventBus
    使用DFA做文本编辑器的自动提示
    计算机网络-IP类型判断
    感兴趣的文章搜集
    The Engine Document of JustWeEngine
    [译文]选择使用正确的 Markdown Parser
    Android源码阅读-Filter过滤器
  • 原文地址:https://www.cnblogs.com/chenzhuantou/p/10150062.html
Copyright © 2011-2022 走看看