乐趣区

关于java:源码学习Java-本地队列-javautilQueue

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 接口,如下图所示:

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
退出移动版