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