HashMap、HashTable和ConcurrentHashMap区别分析

目录

一、底层原理

二、区别


一、底层原理

HashMap底层是由链表和数组组成,在链表长度超过8时,链表转换成红黑树。

为什么Map桶中个数超过8才转为红黑树?

TreeNodes占用空间是普通Nodes的两倍,为了空间和时间的权衡,为6时红黑树也比链表快,但转换过程消耗和空间消耗不划算;节点的分布频率会遵循泊松分布,链表长度达到8个元素的概率为0.00000006,几乎是不可能事件。

为什么转化为红黑树的阈值8和转化为链表的阈值6不一样?为了避免频繁来回转化消耗性能。

HashTable:继承于Dictionary, 不可存储null键和值,线程安全,

ConcurrentHashMap:底层采用分段的数组+链表实现,线程安全,采用分段锁技术,继承于AbstractMap, 不能存储null键和值。

二、区别

1、HashMap的key和value均可以为null,HashTable不可可以;

2、HashMap的非线程安全,HashTable线程安全;

3、HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”;Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。

4、HashMap和HashTable的负载因子是0.75。

5、Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。

6、ConcurrentHashMap的扩容属于段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容(插入前检测需不需要扩容,有效避免无效扩容)。

 

猜你喜欢

转载自blog.csdn.net/weixin_42228950/article/details/100859766