• 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接口,具有同步的功能。

  • 相关阅读:
    3年度研发项目情况项目目标文档
    2系统利益相关者描述案例
    讨论结果
    本学期《软件需求分析》需要掌握的内容(个人总结)
    第二周进度条
    四则运算
    第一周进度记录
    java web
    ke tang zuo ye
    2015-05-26 随笔
  • 原文地址:https://www.cnblogs.com/pro-wall-box/p/11154967.html
Copyright © 2020-2023  润新知