Deque
双端队列,既可以当队列使用,也可以当栈使用。是一个接口。我们来看看 Deque 当作栈和队列时对应的方法。
队列:
Queue Method | Equivalent Deque Method | 说明 |
---|---|---|
add(e) |
addLast(e) |
向队尾插入元素,失败则抛出异常 |
offer(e) |
offerLast(e) |
向队尾插入元素,失败则返回false |
remove() |
removeFirst() |
获取并删除队首元素,失败则抛出异常 |
poll() |
pollFirst() |
获取并删除队首元素,失败则返回null |
element() |
getFirst() |
获取但不删除队首元素,失败则抛出异常 |
peek() |
peekFirst() |
获取但不删除队首元素,失败则返回null |
栈:
Stack Method | Equivalent Deque Method | 说明 |
---|---|---|
push(e) |
addFirst(e) |
向栈顶插入元素,失败则抛出异常 |
无 | offerFirst(e) |
向栈顶插入元素,失败则返回false |
pop() |
removeFirst() |
获取并删除栈顶元素,失败则抛出异常 |
无 | pollFirst() |
获取并删除栈顶元素,失败则返回null |
peek() |
peekFirst() |
获取但不删除栈顶元素,失败则抛出异常 |
无 | peekFirst() |
获取但不删除栈顶元素,失败则返回null |
表面上看起来非常复杂,其实也就是对容器两端进行添加修改和删除操作。Deque 的实现类有 ArrayDeque 和 LinkedList。
ArrayDeque
从名字就可以看出底层通过数组来实现。为了满足可以在数组两端插入和删除元素的需求,该数组还必需是循环数组。
特点:
- 底层实现是循环数组。
- 可以当作栈和对垒来使用。
- 不是线程安全的。
- 不允许放入 null 元素。
方法分析:
因为底层是循环数组结构,所以 ArrayDeque 就需要考虑容量和下标的问题。如果不够需要进行扩容。
Stack
这个类实现了栈的功能,继承自 Vector 类,所以它拥有 Vector 的所有方法和线程安全的特性(因为 synchronized 所以性能没那么高)。
Stack 在 Vector 的基础上加入了 栈相关的操作,比如 push,pop,peek 等等。
如果想要使用栈这种数据结构,首选更加高效的 ArrayDeque。