JDK1.8源码解读之 Queue

328 阅读3分钟

前言

  • Queue 属于 Collection。设计为更偏向于存储元素,而不是处理元素。
  • 除了基本的{@link java.util.Collection Collection}操作之外,队列还提供其他插入,提取和检查操作。
  • 这些方法均以两种形式存在:一种在操作失败时引发异常,另一种返回特殊值({@code null}或{@code false},具体取决于操作)。
  • 插入操作的后一种形式专门设计用于容量受限的{@code Queue}实现;在大多数实现中,插入操作不会失败。
  • 通常(但不一定)以FIFO(先进先出)的方式对元素进行排序。
  • 例外情况包括优先级队列(根据提供的比较器对元素进行排序或元素的自然顺序)和LIFO队列(或堆栈),对LIFO进行排序(后进先出)。
  • 无论使用哪种排序,队列的 head 都是通过调用remove()或poll()来删除的元素。
  • 在FIFO队列中,所有新元素都插入队列的 tail 中。
  • 其他种类的队列可能使用不同的放置规则。每个{@code Queue}实现都必须指定其排序属性。
  • offer 方法在可能的情况下插入一个元素,否则返回 false。
  • 这与Collection.add 方法不同,add方法只会因为 抛出未经检查的异常 而导致添加元素失败。
  • offer方法设计用于在正常情况下(而不是在例外情况下)发生故障,例如在固定容量(或“有界”)队列中。
  • remove()和 poll()方法删除并返回队列的开头。
  • 确切地说,从队列中删除了哪个元素是队列的排序策略的函数,每个实现的实现方式不同。
  • remove()和 poll()方法的区别仅在于队列为空时它们的行为不同:
  • remove()方法引发异常,而 poll()方法返回 null。
  • element()和peek()方法 会返回但是不会移除queue头部的元素。
  • Queue接口没有定义阻塞queue的方法,而这些方法在并行的程序中很常见。
  • 这些方法等待元素出现或者等待空间可行。它们定义在BlockingQueue接口中,BlockingQueue是这个接口的子接口。
  • Queue 的实现通常不允许插入 null 元素,尽管某些实现 LinkedList 不禁止插入 null。
  • 即使在允许的实现中,也不应将 null 插入 Queue 中,因为 poll方法还将 null 用作特殊的返回值,以指示队列不包含任何元素。
  • Queue 的实现 通常不定义方法 equals 和 hashCode 的基于元素的版本,而是从类 Object 继承基于身份的版本,
  • 因为基于元素的相等性,并不总是定义明确 对于元素相同但排序属性不同的队列。

源码

 
 public interface Queue<E> extends Collection<E> {
    /**
     * 如果可以立即添加元素并不收到容量限制,立即添加指定元素到queue。
     * 成功则返回true。如果空间不足则抛出 IllegalStateException 异常。
     */
    boolean add(E e);

    /**
     * 如果可以立即添加元素并不收到容量限制,立即添加指定元素到queue,
     */
    boolean offer(E e);

    /**
     * 检索并移除queue头部的元素。如果是空,抛出异常。
     */
    E remove();

    /**
     * 检索并移除queue头部的元素。如果是空,返回null。
     */
    E poll();

    /**
     * 检索queue头部的元素,但是不会移除元素。queue为空则抛出异常。
     */
    E element();

    /**
     * 检索queue头部的元素,但是不会移除元素。queue为空则返回null。
     */
    E peek();
}