持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
1. 队列(Queue)
队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:
- 把元素添加到队列尾部
- 把队列头部元素取出来
在Java中操作的方法:
| 操作类型 | 抛出Exception | 返回特殊值 |
|---|---|---|
| 插入元素 | add(e) | offer(e) |
| 删除元素 | remove() | poll() |
| 检查元素 | element() | peek() |
2. 双向队列(Deque)
一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写。顾名思义支持双向元素操作:
| 操作类型 | 抛出Exception(头部) | 返回特殊值(头部) | 抛出Exception(尾部) | 返回特殊值(尾部) |
|---|---|---|---|---|
| 插入元素 | push(e)/addFirst(e) | offerFirst(e) | add(e)/addLast(e) | offer(e)/offerLast(e) |
| 删除元素 | remove()/removeFirst()/pop() | poll()/pollFirst() | removeLast() | pollLast() |
| 检查元素 | element()/elementFirst() | peek()/peekFirst() | elementLast() | peekLast() |
3. 优先队列(PriorityQueue)
PriorityQueue实现了一个优先队列:从队首获取元素时,总是获取优先级最高的元素。PriorityQueue默认按元素比较的顺序排序(必须实现Comparable接口),也可以通过Comparator自定义排序算法(元素就不必实现Comparable接口)
4. 阻塞队列(BlockingQueue)
| 操作类型 | 抛出Exception | 返回特殊值 | 阻塞 | 超时 |
|---|---|---|---|---|
| 插入元素 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
| 删除元素 | remove() | poll() | take() | poll(time, unit) |
| 检查元素 | element() | peek() |
5. 阻塞队列的实现
阻塞队列实现分为两大类,有界队列和无界队列:
| 队列名称 | 底层数据结构 | 是否有界 | 备注 |
|---|---|---|---|
| ArrayBlockingQueue | 数组 | 有界队列 | 初始化需要制定队列的大小 |
| LinkedBlockingQueue | 链表 | 有界队列 | 默认最大值Integer.MAX_VALUE |
| PriorityBlockingQueue | 数组 | 有界队列 | 默认大小为11,最大值Integer.MAX_VALUE - 8 |
| DelayQueue | 数组 | 无界队列 | 支持延时 |
| SynchronousQueue | 数组 | 不存储元素 | 同步的:一个offer必须与一个take与之相对应。负责存放不了元素 |
| LinkedTransferQueue | 链表 | 无界队列 | 链表的无界阻塞队列 |
| LinkedBlockingDeque | 链表 | 无界队列 | 双端阻塞队列 |
我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢