Deque接口是“double ended queue”的缩写(通常读作“deck”),即双端队列,支持在队列的两端插入和删除元素,继承Queue接口。大多数的实现对元素的数量没有限制,但这个接口既支持有容量限制的deque,也支持没有固定大小限制的。
Deque接口定义了在两端访问元素的方法,主要包括insert、remove和examine。和Queue定义一样,所有这些方法存在两种形式:一种如果操作失败则抛出异常,另一种则返回一个特殊值(null或false)。后者主要是为有容量限制的队列实现的。
Deque的12种方法总结如下:
First Element (Head) | Last Element (Tail) | |||
Throws exception | Special value | Throws exception | Special value | |
Insert | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
Remove | removeFirst() | pollFirst() | removeLast() | pollLast() |
Examine | getFirst() | peekFirst() | getLast() | peekLast() |
当deque用作queue时,则表现出FIFO的行为,元素从队尾加入,在队首移除,从Queue接口继承来的方法和Deque中的一些方法等同。如下表:
{@code Queue} Method | Equivalent {@code Deque} Method |
{@link java.util.Queue#add add(e)} | {@link #addLast addLast(e)} |
{@link java.util.Queue#offer offer(e)} | {@link #offerLast offerLast(e)} |
{@link java.util.Queue#remove remove()} | {@link #removeFirst removeFirst()} |
{@link java.util.Queue#poll poll()} | {@link #pollFirst pollFirst()} |
{@link java.util.Queue#element element()} | {@link #getFirst getFirst()} |
{@link java.util.Queue#peek peek()} | {@link #peek peekFirst()} |
Deque也可以被用作LIFO的栈,此时的接口应该严格参照Stack类的实现。当deque被用作栈时,元素在deque的head端push/pop。栈的方法等价于Deque中的一些方法,如下表:
Stack Method | Equivalent {@code Deque} Method |
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
注意:peek方法在Deque用作队列和栈时是没问题的,这两种情况都是在deque的head端获得。
Deque接口提供了两种方法来移除内部的元素,removeFirstOccurrence 和 removeLastOccurrence。
Deque与List不同,该接口不支持下标访问元素。Deque的实现并不严格要求禁止插入元素null,但强烈鼓励不插入null。任何Deque的实现都强烈鼓励不要插入null,因为null是多种方法作为一种特殊返回值来表示deque为空。
和Queue一样,Deque的实现通常不定义基于元素的equals和hashCode方法,而是直接继承自Object类。
Deque接口源码:
public interface Deque<E> extends Queue<E> {
/**
* Inserts the specified element at the front of this deque if it is
* possible to do so immediately without violating capacity restrictions,
* throwing an {@code IllegalStateException} if no space is currently
* available. Wh