队列分类梳理

队列分类

单向队列

  • Queue extends Collection 队列实现了 Collection 接口,Collection接口是集合类的顶级接口
  • 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理

    双向队列

  • 双端队列支持同时从两端添加或移除元素
  • 双向队列在java中的接口规范是Deque,是继承Queue,Queue继承Collection
  • ArrayDeque
    • ArrayDeque 是 Deque 接口的一种具体实现,是依赖于可变数组来实现的。ArrayDeque 没有容量限制,可根据需求自动进行扩容。
  • Deque也可被用作LIFO和LIFO
    • FIFO: First in, First out.先进先出。(队列)
    • LIFO: Last in, First out.后进先出。(栈)

      阻塞双向队列

  • BlockingDeque
    • Java.util.concruuent包中的BlockingDeque接口是一种双端队列,向其中加入元素或从中取出元素都是线程安全的。
  • LinkedBlockingDeque是双向链表实现的双向并发阻塞队列
    • LinkedBlockingDeque还是可选容量的(防止过度膨胀),即可以指定队列的容量,如果不指定,默认容量大小等于Integer.MAX_VALUE。
    • 该阻塞队列是支持线程安全。
  • 由于BlockingDeque是一个接口类,使用时需要使用它的实现类。Java.util.concurrent包中有以下关于BlockingDeque接口的实现类:LinkedBlockingDeque

    非阻塞队列

  • ConcurrentLinkedQueue
  • ConcurrentLinkedDeque

    环形队列

  • 线性队列有空间浪费的问题,可以利用环形队列来解决。它是Q(0:n-1)的一维数组,同事Q(0)为Q(n-1)的下一个元素。
    其中,指针front用于以逆时针方向指向队列中第一个元素的前一个位置,rear则指向队列当前的最后位置。一开始front和rear均预设为-1,表示为空队列。也就是说
    如果front=rear则为空队列。
  • 这样设计的好处是,环形队列为空队列和满队列时,front和rear都会指向同一个地方。为更方便我们判断,我们仅允许队列最多存放n-1个数据(亦即牺牲最后一个空间),
    当rear指针的下一个是front的位置时,就认定队列已满,无法再将数据加入。所以一个Q(0:n-1)的环形队列最多只能放n-1个元素。

    优先队列

  • 优先队列(priority queue)为一种不必遵守队列特性--FIFO的有序表,其中的每一个元素都赋予一个优先权(Priority),加入元素时可任意加入,但有最高优先权者(Highest Priority Out First, HPOF)则最先输出。

  • 在计算机中CPU的工作调度,优先权调度(Priority Scheduling, PS)就是一种挑选任务的“调度算法”(Scheduling Aalgotithm),也会使用到优先队列。级别高的用户,就比一般用户拥有较高的权利。

并发队列

  • 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好

你可能感兴趣的:(java)