依赖关系图

ArrayList、HashSet、HashMap 非线程安全
在扩容时均未线程安全的。
Vector,HashTable,ConcurrentHashMap 线程安全
Collections.synchronizedList(list)线程安全
Collections.synchronizedCollection(c) Collections.synchronizedList(list)
Collections.synchronizedMap(m) Collections.synchronizedSet(s)
List list = Collections.synchronizedList(new ArrayList())
原理:在集合的核心方法添加上了 synchronized(mutex)关键字,mutex本质上为当前list。

普通集合:通常性能最高,但是不保证多线程的安全性和并发的可靠性。
线程安全集合:是给集合添加了 synchronized 同步锁,严重牺牲了性能,而且对并发的效率就
更低了,并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率
并发集合:通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率,位 于 java.util.concurrent 包。如ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque 等,
位 于 java.util.concurrent 包。


List | 单列数据集合 | 有序 | 可以重复 | ArrayList,LinkedList,Vectory,Stack |
Set | 单列数据集合 | 无序 | 不可以重复 | HashSet,TreeSet,LinkedHashSet |
Map | key-value数据集合 | 无序 | key不能重复 | Hashtable,Directory,HashMap,TreeMap,LinkedHashMap |
ArrayList,LinkedList,Vectory,Stack区别
类 | 结构 | 特点 |
ArrayList | 动态数组实现的非线程安全的 | 查询快,增删慢 存在空间浪费的情况 |
LinkedList | 双向链表实现的非线程安全的 | 增删快,查询慢 |
Vector | 动态数组实现的线程安全的矢量队列 | 线程安全的,操作慢 |
Stack | 动态数组实现的线程安全的FIFO栈结构 |
Hashtable,Directory,HashMap,TreeMap,LinkedHashMap区别
类 | 实现方式 |
HashMap | 非线程安全的无序的键值对结构;基于动态数组的链表结构;允许key-value同时为null |
LinkedHashMap | HashMap的子类,非线程安全的有序(按照添加顺序)的键值对 |
TreeMap | 非线程安全的有序的键值对;默认采取自然排序,自定义排序时Key要实现Comparable |
ConcurrentHashMap | 线程安全的无序的键值对;基于定长数组的HashMap结构,桶加锁 |
ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。 | |
Hashtable | 线程安全(整个表的加锁)的无序的键值对;弃用;键或值不允许为null;效率<HashMap |
Directory | Hashtable的子类,线程安全的无序的键值对;弃用 |
HashSet,TreeSet,LinkedHashSet区别
类 | 实现方式 |
HashSet | 依赖于HashMap实现的无序的,非线程安全的不可重复的结构(equals(),hashCode()) |
LinkedHashSet | HashSet的子类,基于LinkedHashMap的实现;非线程安全的按照添加顺序的结构 |
TreeSet | 线程安全的有序的键值对(自然排序、指定排序),Key要实现Comparable接口 |