前一段时间一直在Leetcode 刷题,看代码解析的时候发现大多数人用的都是Deque 来代替Stack,于是就产生了好奇.就学习了一下Deque的常用API.不学不知道一学吓一跳,原来Deque还有这么多功能.怕遗忘特此记录
一、Deque的是什么?Java官方推荐使用Deque替代Stack使用,Java堆栈Stack类已经过时.
Deque堆栈操作方法:push()、pop()、peek()。
Deque是一个双端队列接口,继承自Queue接口.
Deque的实现类是linkedList、ArrayDeque、linkedBlockingDeque,但是一般常用linkedList实现接口
一般场景
linkedList 大小可变的链表双端队列,允许元素为 null
ArrayDeque 大下可变的数组双端队列,不允许 null并发场景
linkedBlockingDeque 如果队列为空时,获取操作将会阻塞,知道有元素添加
二、Deque的中定义的函数
Deque中接口定义的非常之多, Deque实现了双向队列,队列,和栈的功能,下面展示Deque三种常用实现
普通队列
Deque
双端队列
Deque
堆栈
Deque
! 这有什么区别哇
没有区别,所以一个Deque在使用的时候你可以一会用栈的方法一会用队列的,只要你不怕被打
Deque
linkedList 实现 Deque 双端队列能够包含的元素数没有固定限制
Deque分别提供插入元素,删除元素以及检查元素,每一种都有两个返回值,一种返回特殊值,一种队列为空时返回异常,支持fast-fail
对应API
| 队列首元素 | 队列尾元素 | |||
| 抛出异常 | 特殊值 | 抛出异常 | 特殊值 | |
| 插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
| 删除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
| 检查 | getFirst() | peekFirst() | getLast() | peekLast() |
Deque
Deque做队列使用时,因为其继承了Queue接口,如果你想直接使用Queue接口是可以的,也可以使用双端队列Api实现队列功能.
如下表所示
| 功能 | Queue,Deque通用方法 | Deque方法 |
| 插入(异常) | add(e) | addLast(e) |
| 插入(特殊值) | offer(e) | offerLast(e) |
| 删除(异常) | remove() | removeFirst() |
| 删除(特殊值) | poll() | pollFirst() |
| 返回队列首元素(异常) | element() | getFirst() |
| 返回队列首元素(特殊值) | peek() | peekFirst() |
Deque
双端队列也可用作 栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出.如果你想直接使用Stack的Api也是可以的.
如下表所示:
| 功能 | Stack,Deque通用方法 | Deque方法 |
| 入栈) | push(e) | addFirst(e) |
| 出栈 | pop() | removeFirst() |
| 查询栈首元素 | peek() | peekFirst() |
Deque是一个非常纯洁全面的接口类,高效.可以在之后的任务中多尝试使用Deque.



