前言
Deque 双端队列 继承了 Queue
Deque
文档介绍
一个线性collection,支持在两端插入和删除。deque 是 “double ended queue”的缩写。绝大多数的Deque实现对它们能包含的元素数没有固定的限制,但此接口支持容量限制,也支持没有固定大小限制的双端队列。
此接口定义了访问队列两端元素的方法。提供了插入,移除,检查元素的方法。这些的每个方法存在两种形式:如果失败一种抛出一个异常,一种返回一个特殊值(null 或 false, 依赖于具体的操作)。后一种形式的插入操作用于具有容量限制的特殊双端队列;在大多数实现中,插入操作不会失败。
上面介绍的十二个方法的概括
有意义的方法名 offer(提供) poll(剪短) peek(偷窃)
- | 头部 | 头部 | 尾部 | 尾部 |
- | 抛出异常 | 特殊值 | 抛出异常 | 特殊值 |
插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
移除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
检查 | getFirst() | peekFirst() | getLast() | peekLast() |
此接口扩展了Queue接口。在将双端队列用于队列时,将得到FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从Queue接口继承的方法完全等效于Deque方法,展示在下表
Queue方法 | 等效Deque方法 |
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
双端队列也可用于后进先出堆栈。就优先使用此接口而不是遗留Stack类,当一个双端队列被用作堆栈时。Stack与Deque完全等价的方法在下面的表格展示
Stack 方法 | 等价的Deque方法 |
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
注意,在将双端队列用作队列或堆栈时,peek方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素
此接口提供了两种移除内部元素的方法:removeFirstOccurrence 和 removeLastOccurrence
与List接口不同,此接口不支持通过索引访问元素。
虽然Deque实现没有严格要求禁止插入null元素,但强烈建议最好这样做。建议使用任何允许null元素的实现的双端队列的用户不利用插入null的功能。这因为当双端队列为空时好多方法将null作为特殊的返回值
Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode 方法。
源码
public interface Deque<E> extends Queue<E>{
void addFirst(E e);
void addLast(E e);
boolean offerFirst(E e);
boolean offerLast(E e);
E removeFirst();
E removeLast();
E pollFirst();
E pollLast();
E getFirst();
E getLast();
E peekFirst();
E peekLast();
boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o);
//队列的方法
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
//堆栈的方法
void push(E e);
E pop();
//集合的方法
boolean remove(Object o);
boolean contains(Object o);
public int size();
Iterator<E> iterator();
Iterator<E> descendingIterator();
}