JAVA源码学习之集合-队列

前言

collection下的List和set我们在前面的几章都讲过了,下面我们去研究,collection下最神秘的,最不常用的Queue

正文

类的描述

compact1, compact2, compact3

java.util

Interface Queue<E>

  • 参数类型

    E -元素举行此集合中的类型

    All Superinterfaces:

    CollectionIterable

    All Known Subinterfaces:

    BlockingDequeBlockingQueueDequeTransferQueue

    所有已知实现类:

    AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedDequeConcurrentLinkedQueueDelayQueueLinkedBlockingDequeLinkedBlockingQueueLinkedListLinkedTransferQueuePriorityBlockingQueuePriorityQueueSynchronousQueue


     
    public interface Queue<E>
    extends Collection<E>
    在处理之前设计的用于保持元素的集合。除了基本的 Collection队列操作,提供额外的插入、提取、检验操作。这些方法都存在两种形式:一个抛出一个异常,如果操作失败,其他返回一个特殊的值(无论是 nullfalse,根据操作)。插入操作的后一种形式是专为使用有容量限制 Queue实现;在大多数实现中,插入操作不会失败。
    Summary of Queue methods
    Throws exceptionReturns special value
    Insertadd(e)offer(e)
    Removeremove()poll()
    Examineelement()peek()

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

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

    remove() 和 poll() 方法移除并返回队列的头部。 从队列中移除哪个元素是队列排序策略的函数,它因实现而异。 remove() 和 poll() 方法仅在队列为空时的行为不同:remove() 方法抛出异常,而 poll() 方法返回 null。

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

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

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

    队列实现通常不定义方法 equals 和 hashCode 的基于元素的版本,而是从类 Object 继承基于身份的版本,因为对于具有相同元素但不同排序属性的队列,基于元素的相等性并不总是很好定义。

层次结构

 阻塞队列的实现类都继承了AbstractQueue

双向队列基本实现了Deque, 但是没有继承AbstractQueue 而是直接继承了AbstractQueue的父类AbstractCollection

当然,LinkedBlockingDeque同时实现了Deque和BockintQueue的接口,他继承了AbstractQueue

根据是否阻塞区分

非阻塞队列 
  内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
  PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 
  PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
  ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,          ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。、

阻塞队列 BlockingQueue (可以看作是线程安全的)
java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
五个队列所提供的各有不同:
  * ArrayBlockingQueue :一个由数组支持的有界队列。
  * LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
  * PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
  * DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
  * SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

关于阻塞相关是摘抄下面文档

 java队列——queue详细分析 - 低调人生 - 博客园 (cnblogs.com)

根据方向区分

单向队列

双向队列  Deque

根据是否有界可以分为

有界队列

无界队列

下面几章我们会具体研究一些队列

上一章                                                                                                                           下一章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值