zoukankan      html  css  js  c++  java
  • hashmap的一些总结

    1. HashMap的底层是数组和链表jdk1.8之后加了红黑树。

    HashSet的底层是HashMap, 其存储的对象在key 里面,

    定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。     private static final Object PRESENT = new Object();  

    HashMap的value 可以是 null, key 也可以 null.所以使用的是containKey来判断是非存在某个key,而不能通过get(key).

           初始容量, 加载因子。

          默认容量等于初始最大容量 * 加载因子。

         HashMap的内部数组的默认长度16, 会自动扩容

          存值的过程是:put(key,value):

      hashcode() 和 equals()来判断key, 如果存在则替换值,所以在便利的时候后者会覆盖前者(key相同的时候)。

    index数组下标的计算方式:

    length: HashMap的主干部分(数组tab)的长度

    int index = hash() & length -1

    tab[index]: Node对象放的位置。

    HashMap不是线程安全的

    HashMap可以通过下面的语句进行同步:
    Map m = Collections.synchronizeMap(hashMap);

    CocurrentHashMap对比HashMap在HashEnty前面加了Segment段   

    当链表的长度达到一定值(默认为8)之后,会转换成红黑树的结构,如下图:

    Hashmap在多线程写入会导致死循环

    CocurrentHashMap通过分段锁的机制,实现了多线程写入时的线程安全

    下图是链表的长度达到默认值8之后转为红黑树的过程:

    currentHashMap 参考:https://blog.csdn.net/liuyuanq123/article/details/80283913

    hashTable:

    Hashtable实现了Map接口,具有同步的功能。

  • 相关阅读:
    Vue 单向数据流&双向数据绑定原理
    Arguments对象
    类数组对象(array-like objects)
    ...theArgs剩余参数
    vue 深度选择器/deep/报错(标红)
    修改mandMobile下拉菜单样式
    PC端input maxlength 失效问题
    el-input 正则限制输入为非负整数
    Mac鼠标左右键都是右键
    Vue双向数据绑定简易实现
  • 原文地址:https://www.cnblogs.com/pro-wall-box/p/11154967.html
Copyright © 2011-2022 走看看