并发容器类Hashmap-Hashtable-ConcurrentHashMap

# Hashmap Hashtable ConcurrentHashMap (并发的) ## Hashmap 1.7 线程不安全的(扩容时)数组+链表 - 是一个初始长度是16的数组 - 数组里面存的是链表 - Hashmap 是一个数组+链表 的结构 - 当添加元素时,会根据key进行hash取模,根据模值添加在不同的链表里 - 当链表下的值过多时(负载因子 0.75),就会进行扩容 , new 数组长度*2=32 - 当扩容成功后,把扩容前的Hashmap的所有值,循环添加到新的数组里 ## Hashmap 1.8 线程不安全的(扩容时)数组+链表+红黑树 - 唯一的区别 - 当链表长度>=8 ,从链表转化为红黑树。 数组+链表+红黑树结构 ## Hashtable 线程安全但是效率低 - 几乎和Hashmap一样 只是增加了synchronized关键字保证同步 - ## ConcurrentHashMap jdk1.7 分段锁 数组+Hashtable+链表 - 是一个初始长度是8(默认值,可指定)的数组 - 数组里面的值是Hashtable(安全的Hashmap) - 当添加元素时,会根据key进行hash取模,根据模值,添加在不同的Hashtable里,之后再进行取模(hash2),添加再不同的链表里 - 好处:Hashtable是同步的(synchronized)同一时间只有一个线程可以访问和修改。但是ConcurrentHashMap 有多个Hashtable,并发度比之前高(有多少个Hashtable就允许同一时间有多少线程可以访问),性能比之前好。 - 数组是不扩容的,数组下的链表是可以扩容的 - ## ConcurrentHashMap jdk1.8 分段锁 数组+链表+红黑树 - 数组里面存的是链表 - 当链表长度>=8 ,从链表转化为红黑树。 数组+链表+红黑树结构 - 当数组下标为null是添加是根据CAS机制来保证安全的 - 不为null时利用synchronized锁住链表头部(就是锁住了整个链表),在进行操作 > 和1.7的区别 ![image.png](https://cos.easydoc.net/31477061/files/kmcu4bls.png)