Queue接口

  Queue —— 队列,是一种具有FIFO(先进先出)特性的线性表,非常常用。Java实现中,Queue接口继承自Collection接口,并提供了基础能力的抽象。

package java.util;

public interface Queue<E> extends Collection<E>

boolean add(E e)
  将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。

  add函数在Collection接口就已经申明了。在Queue中,add函数的语义得到了进一步的明确。

boolean offer(E e)
  将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。

E remove()
  获取并移除此队列的头。此方法与 poll 唯一的不同在于:此队列为空时将抛出一个异常。

E poll()
  获取并移除此队列的头,如果此队列为空,则返回 null。

E element()
  获取,但是不移除此队列的头。此方法与 peek 唯一的不同在于:此队列为空时将抛出一个异常。

E peek()
  获取但不移除此队列的头;如果此队列为空,则返回 null。

队列方法总结
- 抛出异常 返回特殊值
插入 add() offer()
移除 remove() poll()
检查 element() peek()
是否允许null元素

  Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

Deque接口

  Deque —— 双端队列、double ended queue,是一种具有FIFO(先进先出)和LIFO(后进先出)性质的数据结构。在Java实现中,Deque接口继承自Queue接口,并提供了进一步的抽象。

package java.util;

public interface Deque<E> extends Queue<E>  

  Deque接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。

第一个元素(头部) 最后一个元素(尾部)
抛出异常 特殊值 抛出异常 特殊值
插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)
移除 removeFirst() pollFirst() removeLast() pollLast()
检查 getFirst() peekFirst() getLast() peekLast()

  除了上述十二个新增的函数,Deque接口中还定义了2个堆栈函数和2个删除函数,堆栈函数在随后的章节中会具体介绍。

  Queue接口中的remove(Object o)方法是从此双端队列中移除第一次出现的指定元素,等效于removeFirstOccurrence(Object o)。

void push(E e);

E pop();

// 从此双端队列移除第一次出现的指定元素。
boolean removeFirstOccurrence(Object o);  

// 从此双端队列移除最后一次出现的指定元素。
boolean removeLastOccurrence(Object o);  
用作队列结构

  在将双端队列用作队列时,将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于Deque接口种的新方法。

Queue 方法 等效 Deque 方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()
用作堆栈结构

  当要使用Stack这一数据结构时,应优先使用此接口的实现,而不是使用java.util.Stack类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法。

堆栈方法 等效 Deque 方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()
是否允许null元素

  虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好不 要利用插入 null 的功能。这是因为各种方法会将 null 用作特殊的返回值来指示双端队列为空。