并发容器类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)