Deque 接口继承自 Queue 接口,deque 是 double ended queue 的缩写,发音类似于 deck。

双端操作

Queue 只能“尾部插入,头部取出”,但 Deque 的头部和尾部都能进行操作,并提供了两套方法:

  1. public interface Deque<E> extends Queue<E> {
  2. // insert oprations
  3. void addFirst(E e); void addLast(E e);
  4. boolean offerFirst(E e); boolean offerLast(E e);
  5. // remove oprations
  6. E removeFirst(); E removeLast();
  7. E pollFirst(); E pollLast();
  8. // examine oprations
  9. E getFirst(); E getLast();
  10. E peekFirst(); E peekLast();
  11. ...
  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

虽然 Deque 接口新定义了一套方法(如上所示),但由于其继承自 Queue 接口,所以 Deque 自然也继承了 Queue 声明的方法,它们的对应关系如下所示:

Throws exception Special value
Queue 方法 Deque 等效方法 Queue 方法 Deque 等效方法
insert add(e) addLast(e) offer(e) offerLast(e)
remove remove() removeFirst() poll() pollFirst()
examine element() getFirst() peek() peekFirst()

Deque 与 Stack

栈是一个后进先出(LIFO)队列,由于 Deque 可以进行双端操作,所以 Deque 接口声明如下方法:

// Stack methods 
void push(E e);        // 相当于 addFirst(e)
E pop();            // 相当于 removeFirst()

如果想使用栈结构,不要使用遗留类 —— Stack,而应该使用 ArrayDequeLinkedList

其它方法

除了上述方法外, Deque 接口还声明了如下几个方法:

boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o);

Iterator<E> descendingIterator();

null 限制

Deque 接口并未限制 element 不能为 null,但鼓励接口实现类禁止 element 为 null 。因为 poll()pollFirst()pollLast()peek()peekFirst()peekLast() 在 deque 为空时都返回 null ,如果实现类允许 element 为 null ,则无法判断上述方法返回的 null 究竟是 element 为 null ,还是 deque 为空。