Queue接口源码分析

java.util.Queue 接口直接继承自 java.util.Collection 接口。

一、Queue接口特点或规范

除了基本的 Collection 功能外,队列还提供额外的 插入提取检查 三组操作。其中每组都以两种形式存在:

  • 一种在操作失败时抛出异常
  • 一种返回特殊值(**null** 或 false,具体取决于操作),此形式的插入操作专门用于容量限制的队列实现;在大多数实现中,插入操作不会失败。

1.1 队列方法摘要

操作 抛出异常 返回特殊值
插入 add(E) offer(E)
删除 remove() poll()
获取 element() peek()

1.2 队列进出顺序

  • 队列通常(但不一定)以 FIFO(先进先出) 方式对元素进行排序。例外
    • 优先级队列:根据提供的比较器对元素进行排序,或者元素的自然排序。
    • 后进先出队列(或 ):它们对元素 LIFO(后进先出) 进行排序。
  • FIFO 队列中,所有 新元素 都插入队列的 尾部
  • 无论使用什么顺序,队列的头部都是通过调用 remove()poll() 方法来删除的元素。
  • 其他类型的队列可能使用不同的放置规则。
  • 每个 Queue 的实现都必须指定其排序属性。

1.3 并发队列

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

1.4 插入null值规范

队列实现通常不允许插入 null 元素,尽管某些实现(如:**LinkedList**)不禁止插入 **null**。即使在允许它的实现中,也不应将 null 插入到 Queue 中,因为 null 也被 poll() 方法用作特殊返回值,以指示队列不包含任何元素。

1.5 equals()和hashCode()

队列实现通常不定义基于元素的 equals()hashCode() 方法,而是基于当前队列从 Object 类继承,因为基于元素的相等并不总是为具有相同元素但具有不同排序属性的队列定义良好。


二、方法描述

2.1 添加方法

如果队列允许插入,**offer(E)** 方法将插入一个元素,否则返回 **false**。这与 Collection.add(E) 方法不同,后者只能通过抛出未经检查的异常来添加元素。

在固定容量(或“有界”)队列中,**offer(E)** 方法可以将返回是否插入成功,**add(E)** 方法如果无法添加,则会抛出异常。

1
2
boolean add(E e);
boolean offer(E e);

2.2 删除方法

remove()poll() 方法删除并返回队列的头元素。即:从队列中删除排序策略的第一个元素,依赖排序实现的不同。

区别仅在于队列为空时:

  • remove() 方法抛出异常
  • poll() 方法方法返回 null
1
2
E remove();
E poll();

2.3 获取方法

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

区别仅在于队列为空时:

  • element() 方法抛出异常
  • peek() 方法方法返回 null
1
2
E element();
E peek();

Queue接口源码分析
https://cuilan.github.io/2019/08/05/java/util/Queue-source-analysis/
作者
zhang.yan
发布于
2019年8月5日
许可协议