一、介绍

队列。一个用于在处理元素之前保存元素的集合。

除了基本的 Collection 操作外,队列还提供了额外的插入、提取和检索操作。每一种类型的方法都有两种实现形式:一种在操作失败时抛出异常,另一种则返回一个特殊值(取决于操作,返回 nullfalse)。后一种形式的插入操作专门为容量受限的队列实现设计;在大多数实现中,插入操作不会失败。

队列方法总结

操作类型 抛出异常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
检索 element() peek()

队列通常(但不一定)按照 FIFO(先进先出)的方式对元素进行排序。例外情况有:

  • 优先级队列,它根据提供的比较器或元素的自然顺序排序。
  • LIFO 队列(栈),它按 LIFO(后进先出)方式排序。

无论使用何种排序方式,队列头部的元素是调用 remove()poll() 时将被移除的元素。在 FIFO 队列中,所有新元素插入到队列的尾部。其他种类的队列可能会使用不同的放置规则。每个队列实现都必须明确其排序属性。

offer 方法在可能的情况下插入一个元素,无法插入时返回 false。这与 Collectionadd 方法不同,后者只有通过抛出未检查的异常才能导致插入失败。offer 方法设计用于当失败是正常情况而非异常情况时使用,例如在固定容量(或“有界”)队列中。

remove()poll() 方法移除并返回队列的头部元素。具体移除哪个元素取决于队列的排序策略,不同的实现可能有所不同。remove()poll() 方法的区别在于,当队列为空时,remove() 方法抛出异常,而 poll() 方法返回 null

element()peek() 方法返回但不移除队列的头部元素。

Queue 接口不定义阻塞队列的方法,这些方法在并发编程中常见。阻塞队列的方法会等待元素出现或空间可用,这些方法在 java.util.concurrent.BlockingQueue 接口中定义,该接口扩展了 Queue 接口。

队列实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)不禁止插入 null。即使在允许插入 null 的实现中,也不应将 null 插入队列,因为 poll 方法也使用 null 作为特殊返回值,表示队列中没有元素。

队列实现通常不定义基于元素的 equalshashCode 方法,而是继承自 Object 类的基于对象身份的版本,因为对于具有相同元素但不同排序属性的队列,基于元素的相等性并不总是定义良好。

二、源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface Queue<E> extends Collection<E> {

boolean add(E e);

boolean offer(E e);

E remove();

E poll();

E element();

E peek();
}

1、add 方法

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

2、offer 方法

boolean offer(E e); 方法在不违反容量限制的情况下立即将指定元素插入此队列。使用容量受限的队列时,此方法通常优于 add 方法,后者只能通过抛出异常来表示插入失败。

3、remove 方法

E remove(); 方法检索并移除此队列的头部元素。此方法与 poll() 的区别在于,当队列为空时,它会抛出异常。

4、poll 方法

E poll(); 方法检索并移除此队列的头部元素,如果队列为空,则返回 null

5、element 方法

E element(); 方法检索但不移除此队列的头部元素。此方法与 peek() 的区别在于,当队列为空时,它会抛出异常。

6、peek 方法

E peek(); 方法检索但不移除此队列的头部元素,如果队列为空,则返回 null

相关链接

Collection | z2huo

[[Collection]]

OB tags

#Java