Java 集合框架中的 Queue 接口
一、介绍
队列。一个用于在处理元素之前保存元素的集合。
除了基本的 Collection 操作外,队列还提供了额外的插入、提取和检索操作。每一种类型的方法都有两种实现形式:一种在操作失败时抛出异常,另一种则返回一个特殊值(取决于操作,返回 null 或 false)。后一种形式的插入操作专门为容量受限的队列实现设计;在大多数实现中,插入操作不会失败。
队列方法总结
| 操作类型 | 抛出异常 | 返回特殊值 |
|---|---|---|
| 插入 | add(e) |
offer(e) |
| 移除 | remove() |
poll() |
| 检索 | element() |
peek() |
队列通常(但不一定)按照 FIFO(先进先出)的方式对元素进行排序。例外情况有:
- 优先级队列,它根据提供的比较器或元素的自然顺序排序。
- LIFO 队列(栈),它按 LIFO(后进先出)方式排序。
无论使用何种排序方式,队列头部的元素是调用 remove() 或 poll() 时将被移除的元素。在 FIFO 队列中,所有新元素插入到队列的尾部。其他种类的队列可能会使用不同的放置规则。每个队列实现都必须明确其排序属性。
offer 方法在可能的情况下插入一个元素,无法插入时返回 false。这与 Collection 的 add 方法不同,后者只有通过抛出未检查的异常才能导致插入失败。offer 方法设计用于当失败是正常情况而非异常情况时使用,例如在固定容量(或“有界”)队列中。
remove() 和 poll() 方法移除并返回队列的头部元素。具体移除哪个元素取决于队列的排序策略,不同的实现可能有所不同。remove() 和 poll() 方法的区别在于,当队列为空时,remove() 方法抛出异常,而 poll() 方法返回 null。
element() 和 peek() 方法返回但不移除队列的头部元素。
Queue 接口不定义阻塞队列的方法,这些方法在并发编程中常见。阻塞队列的方法会等待元素出现或空间可用,这些方法在 java.util.concurrent.BlockingQueue 接口中定义,该接口扩展了 Queue 接口。
队列实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)不禁止插入 null。即使在允许插入 null 的实现中,也不应将 null 插入队列,因为 poll 方法也使用 null 作为特殊返回值,表示队列中没有元素。
队列实现通常不定义基于元素的 equals 和 hashCode 方法,而是继承自 Object 类的基于对象身份的版本,因为对于具有相同元素但不同排序属性的队列,基于元素的相等性并不总是定义良好。
二、源码
1 | public interface Queue<E> extends Collection<E> { |
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。
相关链接
OB links
[[Collection]]
OB tags
#Java