点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~


什么是 Deque

DequeDouble ended queue (双端队列) 的缩写,读音和 deck 一样,蛋壳。

Deque 继承自 Queue,直接实现了它的有 LinkedList, ArayDeque, ConcurrentLinkedDeque 等。

Deque 支持容量受限的双端队列,也支持大小不固定的。一般双端队列大小不确定。

Deque 接口定义了一些从头部和尾部访问元素的方法。比如分别在头部、尾部进行插入、删除、获取元素。和 Queue

类似,每个操作都有两种方法,一种在异常情况下直接抛出异常奔溃,另一种则不会抛异常,而是返回特殊的值,比如 false, null …

插入(Insert)方法的第二种是针对固定大小的双端队列设计的。大多数情况下 插入都不会失败。

Deque 继承了 Queue 接口的方法。当 Deque 当做 队列使用时(FIFO),添加元素是添加到队尾,删除时删除的是头部元素。从 Queue 接口继承的方法对应容器的方法如图所示:

Deque 也能当栈用(后进先出)。这时入栈、出栈元素都是在 双端队列的头部 进行。Deque 中和栈对应的方法如图所示:

Deque 包含的方法如下图所示:

根据名字就能看到功能,具体实现我们下篇看 LinkedList 源码时介绍。

Deque 的实现类

Deque 的实现类主要分为两种场景:

  • 一般场景

    • LinkedList 大小可变的链表双端队列,允许元素为 null
    • ArrayDeque 大下可变的数组双端队列,不允许 null
  • 并发场景
    • LinkedBlockingDeque 如果队列为空时,获取操作将会阻塞,知道有元素添加

Deque 与 工作密取

在并发编程 中,双端队列 Deque 还用于 “工作密取” 模式。

什么是工作密取呢?

在 生产者-消费者 模式中,所有消费者都从一个工作队列中取元素,一般使用阻塞队列实现;

而在 工作密取 模式中,每个消费者有其单独的工作队列,如果它完成了自己双端队列中的全部工作,那么它就可以从其他消费者的双端队列末尾秘密地获取工作。

工作密取 模式 对比传统的 生产者-消费者 模式,更为灵活,因为多个线程不会因为在同一个工作队列中抢占内容发生竞争。在大多数时候,它们只是访问自己的双端队列。即使需要访问另一个队列时,也是从 队列的尾部获取工作,降低了队列上的竞争程度。

Thanks

https://docs.oracle.com/javase/tutorial/collections/interfaces/deque.html
https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html
http://www.nowamagic.net/librarys/veda/detail/2296
《Java 并发编程实战》

Java 集合深入理解(10):Deque 双端队列相关推荐

  1. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

  2. C++---deque双端队列

    deque deque双端队列,是C++,STL标准模板库中提供的一种容器. 什么是双队列 队列:是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear) ...

  3. STL源码剖析 deque双端队列 概述

    vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间. deque可以在头尾两端分别进行元素的插入和删除操作 vector和deque的差异 1,deque允许常数时间内对于头 ...

  4. stl之deque双端队列容器

    deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除.不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势. 头文件 #include ...

  5. STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

    Stack是一种先进后出的数据结构,他只有一个出口 stack允许 新增元素.移除元素.取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为 Stack定义的完整列表 (双端 ...

  6. C++deque双端队列

    调用头文件: #include<deque> using namespace std; 详细用法(部分): deque<Type> k;      ------      定义 ...

  7. STL源码剖析 序列式容器 deque双端队列

    相较于vector的内存拷贝,deque在内存不足时只需要进行内存的拼接操作即可,不需要重新配置.复制.释放等操作,代价就是迭代器的架构不是一个普通的指针,比较复杂 d e q u e 的迭代器 de ...

  8. C++ 双端队列(deque)的使用

    双端队列(deque)是什么 双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector, 双端队列(deque)属于STL(Standard ...

  9. 队列(queue)与双端队列(deque)—Python实现方法及回文词应用

    队列 Queue 抽象数据类型Queue:一个有次序的数据集合,数据项仅从 尾(rear) 端添加,且仅从 首(front) 端移除,具有 "FIFO" 的特点. 需要实现的操作: ...

最新文章

  1. 简单的dns解析过程
  2. 使用maven快速构建SSM项目
  3. 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
  4. boost::mpl模块as_sequence的测试程序
  5. apache pdfbox_Apache PDFBox命令行工具:无需Java编码
  6. 大疆云台如何使用华为mate20pro_华为Mate30+大疆灵眸Osmo3,让你的照片和短视频称霸朋友圈...
  7. Javascript—③对象
  8. Springboot starter开发之traceId请求日志链路追踪
  9. java计算两个时间段的重合天数
  10. 第二十二章 职业道德规范
  11. Android ROM DIY之MTK平台手机通用移植 (续)
  12. winrar 命令行参数使用
  13. 空间相关分析(三) 局部莫兰指数的理解与计算
  14. r语言 与python r中python环境的创建
  15. matlab生成对角占优矩阵,latex对角矩阵diag
  16. 如何去实现机械灵巧手玩魔方和弹钢琴_我学会了玩魔方
  17. 记录:2018年CCF优秀博士学位论文奖信息
  18. 如何使用NFC读卡器读取NFC卡片的UID
  19. 租借高防服务器和托管高防服务器哪个好?
  20. 《CSS实战案例汇总》涟漪

热门文章

  1. ubuntu 16.04 使用五笔拼音输入法
  2. 关于计算机的名人名言英语,英语名人名言
  3. 认真开始学习C语言的2天总结(师承上官可编程----老陈)
  4. 计算机物联网知识,计算机科学技术对物联网的5大作用分析
  5. 机器学习笔记(2)----“没有免费的午餐”定理
  6. COM劫持 BypassUAC
  7. centios修改盘符
  8. 前端实现网络小说阅读器
  9. 如何进行自我职业规划?
  10. Swift之高德地图的调用