源码学习:Java 本地队列 - java.util.Queue

1. 接口定义

这是一种设计用于在处理之前保存元素的集合。除了基本的 java.util.Collection 操作以外,队列还提供了额外的插入提取检索操作。这些操作方法都以两种形式存在:一种在操作失败时抛出异常,另一种是返回一个特殊值(根据操作的不同,可以是 nullfalse)。后一种形式的插入操作是专门为使用容量设限的 Queue 实现而设计的;在大多数实现中,插入操作不会失败。

- 抛出异常 返回特殊值
插入 add(e) offer(e)
提取/移除 remove() poll()
检索/检查 element() peek()

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

offer() 方法在可能的情况下插入一个元素,否则返回 false。这与 Collection.add() 方法不同,add() 方法只能通过抛出未检查的异常来指示添加元素失败。而 offer() 方法被设计用于“失败是正常的,而不是异常的”的情况,例如在固定容量(或“有界”)队列中。

remove()poll() 方法移除并返回队列头部元素,具体从队列中移除哪个元素是由队列排序策略的一个函数指定,不同的 Queue 实现是不同的。remove()poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出异常,而 poll() 方法则返回 null

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

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

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

Queue 实现通常不定义 equals()hashCode() 的基于元素版本的方法,而是从类 Object 继承基于标识版本的方法,因为对于具有相同元素但不同排序属性的队列来说,基于元素的相等并不总是定义明确的。

java.util.Queue 接口继承于 java.util.Collection 接口,而 java.util.Collection 接口又继承于 java.lang.Iterable 接口,如下图所示:

源码学习:Java 本地队列 - java.util.Queue_第1张图片

2. 方法声明

1)boolean add(E e);

  • 如果可以在不违反容量限制的情况下立即将指定的元素插入到该队列中,则在插入成功时返回 true(如 Collection.add() 所指定的);
  • 如果此时由于容量限制(没有可用空间)而不能添加元素,则抛出 java.lang.IllegalStateException
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

2)boolean offer(E e);

  • 如果可以在不违反容量限制的情况下立即将指定的元素插入到该队列中,则在插入成功时返回 true,否则返回 false。当使用容量设限的队列时,这个方法通常比 add() 更适合使用,因为在因容量限制(没有可用空间)而不能添加元素时,add() 方法只能抛出异常;
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

3)E remove();

  • 检索并移除此队列的头部元素,此方法与 poll() 方法的不同之处在于:如果队列为空,则抛出异常;
  • 如果队列为空,则抛出 java.util.NoSuchElementException

4)E poll();

  • 检索并移除此队列的头部元素,如果队列为空,返回 null

5)E element();

  • 检索(但并不移除)此队列的头部元素,此方法与 peek() 方法的不同之处在于:如果队列为空,则抛出异常;
  • 如果队列为空,则抛出 java.util.NoSuchElementException

6)E peek();

  • 检索(但并不移除)此队列的头部元素,如果队列为空,返回 null

你可能感兴趣的:(java队列学习)