zoukankan      html  css  js  c++  java
  • 队列分类梳理

    队列分类

    单向队列
    • 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非阻塞算法实现,使用非阻塞队列一般性能比较好
  • 相关阅读:
    [工作积累点滴整理]虚拟化、云计算配置规划<一>
    视频监控——从其他浏览器打开低版本IE方案
    好记性不如烂笔头-nginx安装环境与Linux安装ftp组件
    (阿里巴巴)数据库连接池——Druid (未完持续更新)
    条形码和二维码编码解码工具类源码
    JS防抖与节流函数封装
    根据设备width(375)动态设置font-size
    JS写一个简单日历
    js常用身份校验规则
    list之flex布局写法及禁止橡皮筋效果
  • 原文地址:https://www.cnblogs.com/frankltf/p/10345168.html
Copyright © 2011-2022 走看看