1、底层数据结构:
JDK1.7的ConcurrentHashMap底层使用分段的数据+链表实现,JDK1.8采用的数据结构和HashMap1.8的结构一样。数据+链表/红黑二叉树。
Hashttable和JDK1.8之前的HashMap的底层数据结构类似都是采用数据+链表的形式,数组是HashMap的主体,链表是为了解决哈希冲突而存在的。
2、实现线程安全的方式(重要):
在JDK1.7的时候,ConcurrentHashMap(分段锁)对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中的一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
在JDK1.8的时候,已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。
Hashtable(同一把锁),使用synchronsized来保证线程安全,效率低下。当一个线程访问同步方法时,其他线程也访问同步方法时,可能会进入阻塞或轮询状态,如使用put添加元素,另一个线程不能使用put添加元素,也不能get。