概念
FIFO
First in First out,先进先出 队列LIFO
Last in First out,后进先出 栈RandomAccess
,是一个标识,实现了改接口的容器,快速随机访问功能有序
:插入的顺序保持,当遍历集合时会按照插入顺序展示;无序
:不保持插入的顺序同步
:即线程安全,可以在多线程下保持数据正确;不同步
:线程不安全有界
:有容量限制,会阻塞或者触发异常;无界
:没有容量限制- 命名中带有
Array
都是数组实现,Linked
都是链表实现
Collection 集合
List 序列
ArrayList
Vector
synchronized
同步方法和代码块
Stack LIFO栈
- 后进先出(LIFO)栈,推荐使用Deque
LinkedList
- 双向链表实现
CopyOnWriteArrayList
- 同步
lock
锁实现,性能更好- 适合读多写少场景
- 数据最终一致性,不能保证数据的实时一致性
Set 不可重复集合
TreeSet
TreeMap
实现
HashSet
HasMap
实现
LinkedHashSet
CopyOnWriteArraySet
- 同步
- 基于
CopyOnWriteArrayList
实现
ConcurrentSkipListSet
- 同步
- 有序
ConcurrentSkipListMap
实现
Queue FIFO队列
AbstractQueue
PriorityQueue
- 自己内部排序
- 无界
- 不同步
ConcurrentLinkedQueue
- 无界
- 同步
Deque 双端队列
- 可以从头部和尾部获取元素
ArrayDeque
- 无界
- 不同步
ConcurrentLinkedDeque
- 无界
- 同步
BlockingQueue 阻塞队列
- 同步
- 有界
- 当生产者向队列添加元素但队列已满时,生产者会被阻塞
- 当消费者从队列移除元素但队列为空时,消费者会被阻塞
异常 | 返回null | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
删除 | remove() | poll() | take() | poll(time,unit) |
检查 | element() | peek() | 不适用 | 不适用 |
ArrayBlockingQueue
- 可选公平,降低吞吐量
- 先阻塞的生产者线程,可以先往队列里插入元素
- 先阻塞的消费者线程,可以先从队列里获取元素
LinkedBlockingQueue
- 比
ArrayBlockingQueue
吞吐量高
BlockingDeque 阻塞双端队列
LinkedBlockingDeque
PriorityBlockingQueue
- 无界
- 自己内部排序 同
PriorityQueue
TransferQueue 传输队列
- 生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费
LinkedTransferQueue
- 无界
Map 映射
TreeMap
- 可以自定义排序规则
HashMap
- 数组(桶)+链表(数量小于8)+红黑树(大于等于8) 实现
- 初始容量:默认16。如果指定必须是2的n次幂
- 负载因子:默认0.75。
- 调低负载因子,HashMap 的增删改查等操作的效率将会变高,这里是典型的拿空间换时间
- 反之,则相反
- 负载:初始容量*负载因子。超过负载会扩容
- 扩容:
- HashMap会扩容到原来的两倍
- 每个元素重新Hash
- 消耗性能
LinkedHashMap
Hashtable
- synchronized 同步所有方法,效率不高
ConcurrentHashMap
- volatile CAS 轻量级的同步
- 效率高于HashTable
ConcurrentSkipListMap
EnumMap
- key值为枚举