java中HashMap和ConcurrentHashMap的共性以及区别
HashMap和ConcurrentHashMap都是用于存储key-value键值对数据,但是两者有相同之处和不同之处。以 jdk 1.8为例进行说明。
相同点
数据存储方式
都是基于数组+链表/红黑树的方式存储数据。
阈值
数组初始化默认值是16,加载因子是0.75,扩容阈默认值是初始化默认值*加载因子=12,链表转红黑树阈值是8,数组大小>64且链表长度>8触发链表转红黑树操作。
不同点
HashMap中key和value没有做限制,ConcurrentHashMap中必须是不为null。
ConcurrentHashMap为了保证并发操作,在插入数据过程中使用了cas功能。
代码层面
初始化
HashMap
resize()
ConcurrentHashMap
initTable()
扩容
HashMap
resize()
treeifyBin()
ConcurrentHashMap
helpTransfer()
transfer()
treeifyBin()
链表转红黑树
HashMap
treeifyBin()
ConcurrentHashMap
treeifyBin()
总结如下
功能 | HashMap | ConcurrentHashMap |
初始化 | resize() | initTable() |
扩容 | resize() 转红黑树前数组长度<64触发扩容 | helpTransfer() 转红黑树前数组长度<64触发扩容 treeifyBin() |
链表转红黑树 | treeifyBin() | treeifyBin() |