Deque
接口继承自 Queue
接口,deque 是 double ended queue 的缩写,发音类似于 deck。
双端操作
Queue 只能“尾部插入,头部取出”,但 Deque 的头部和尾部都能进行操作,并提供了两套方法:
public interface Deque<E> extends Queue<E> {
// insert oprations
void addFirst(E e); void addLast(E e);
boolean offerFirst(E e); boolean offerLast(E e);
// remove oprations
E removeFirst(); E removeLast();
E pollFirst(); E pollLast();
// examine oprations
E getFirst(); E getLast();
E peekFirst(); E peekLast();
...
}
上述方法的总结如下表所示:
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,而应该使用 ArrayDeque
或 LinkedList
。
其它方法
除了上述方法外, 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 为空。