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

posted @ 2019-07-09 00:45  real汪磊  阅读(257)  评论(0编辑  收藏  举报