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 用作特殊的返回值来指示双端队列为空。