队列(Queue)——JDK源码的阅读

队列(Queue)——JDK源码的阅读

    • 队列(queue)的概述
    • 队列的排序方式
    • Queue的方法详细信息
    • Queue需要注意的特殊之处

队列(queue)的概述

  1. JDK1.8 API对于队列的解释:
    设计用于在处理之前保存元素的集合。除了基本的收集操作外,队列还提供附加的插入提取检查操作。这些方法有两种形式:一种是在操作失败时抛出异常,另一种是返回特殊值(null或false,取决于操作)。后一种插入操作是专门设计用于容量限制队列实现的;在大多数实现中,插入操作不会失败。
    队列(Queue)——JDK源码的阅读_第1张图片
  2. All Superinterfaces:
. Collection<E>, Iterable<E> 
  1. All Known Subinterfaces:
BlockingDeque<E>,
 BlockingQueue<E>, 
 Deque<E>, 
 TransferQueue<E> 
  1. All Known Implementing Classes:
AbstractQueue,
  ArrayBlockingQueue//一个由数组支持的有界阻塞队列
  /**
  名称 deque 是“double ended queue(双端队列)”的缩写。
  
  **/
  ArrayDeque, //数组双端队列
  ConcurrentLinkedQueue, //一个基于链接节点的无界线程安全队列。
  ConcurrentLinkedDeque, //一个基于链接节点的无界线程安全双端队列。1.6没有,1.8才有的
  DelayQueue, //Delayed 元素的一个无界阻塞队列
  LinkedBlockingDeque, 
  LinkedBlockingQueue, 
  LinkedList, 
  LinkedTransferQueue,//1.6没有,1.8才有的
  PriorityBlockingQueue, 
  PriorityQueue, //一个基于优先级堆的无界优先级队列
  SynchronousQueue //一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然

队列的排序方式

  1. 队列一般是一FIFO(first in first out)的方式进行工作。不过优先级队列和 LIFO 队列(或堆栈)例。
  2. 优先级队列:前者根据提供的比较器或元素的自然顺序对元素进行排序
  3. LIFO队列:按 LIFO(后进先出)的方式对元素进行排序.
    不过以上三种方式的队列排序,队列的头都是调用remove()或poll()所移除的元素。在FIFO队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个 Queue 实现必须指定其顺序属性。

Queue的方法详细信息

由于queue是一个接口因此其方法的具体实现代码需要看实现类中的方法代码。

  1. 插入元素boolean add(E e)boolean Offer(E e)方法

队列(Queue)——JDK源码的阅读_第2张图片
队列(Queue)——JDK源码的阅读_第3张图片
如果可能,offer 方法可插入一个元素,否则返回 false。这与 Collection.add 方法不同,该方法只能通过抛出未经检查的异常使添加元素失败。offer 方法设计用于正常的失败情况,而不是出现异常的情况,例如在容量固定(有界)的队列中。

  1. 移除元素 E remove()E poll()
    队列(Queue)——JDK源码的阅读_第4张图片
    队列(Queue)——JDK源码的阅读_第5张图片
    remove() 和 poll() 方法可移除和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。remove() 和 poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出一个异常,而 poll() 方法则返回 null。

  2. 检查元素E element()E peek()
    队列(Queue)——JDK源码的阅读_第6张图片
    队列(Queue)——JDK源码的阅读_第7张图片

  3. Queue继承的方法

队列(Queue)——JDK源码的阅读_第8张图片
5. Queues实现方法java.lang.Iterable (jdk1.8)
在这里插入图片描述

Queue需要注意的特殊之处

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

  2. Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素,即poll返回null是说明队列中没有值的,而插入了null值,逻辑就矛盾了。

  3. Queue 实现通常未定义 equalshashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。

你可能感兴趣的:(数据结构)