Java 集合深入理解(10):Deque 双端队列
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~
什么是 Deque
Deque 是 Double 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 双端队列相关推荐
- python deque双端队列的神奇用法
python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...
- C++---deque双端队列
deque deque双端队列,是C++,STL标准模板库中提供的一种容器. 什么是双队列 队列:是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear) ...
- STL源码剖析 deque双端队列 概述
vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间. deque可以在头尾两端分别进行元素的插入和删除操作 vector和deque的差异 1,deque允许常数时间内对于头 ...
- stl之deque双端队列容器
deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除.不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势. 头文件 #include ...
- STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器
Stack是一种先进后出的数据结构,他只有一个出口 stack允许 新增元素.移除元素.取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为 Stack定义的完整列表 (双端 ...
- C++deque双端队列
调用头文件: #include<deque> using namespace std; 详细用法(部分): deque<Type> k; ------ 定义 ...
- STL源码剖析 序列式容器 deque双端队列
相较于vector的内存拷贝,deque在内存不足时只需要进行内存的拼接操作即可,不需要重新配置.复制.释放等操作,代价就是迭代器的架构不是一个普通的指针,比较复杂 d e q u e 的迭代器 de ...
- C++ 双端队列(deque)的使用
双端队列(deque)是什么 双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector, 双端队列(deque)属于STL(Standard ...
- 队列(queue)与双端队列(deque)—Python实现方法及回文词应用
队列 Queue 抽象数据类型Queue:一个有次序的数据集合,数据项仅从 尾(rear) 端添加,且仅从 首(front) 端移除,具有 "FIFO" 的特点. 需要实现的操作: ...
最新文章
- 简单的dns解析过程
- 使用maven快速构建SSM项目
- 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
- boost::mpl模块as_sequence的测试程序
- apache pdfbox_Apache PDFBox命令行工具:无需Java编码
- 大疆云台如何使用华为mate20pro_华为Mate30+大疆灵眸Osmo3,让你的照片和短视频称霸朋友圈...
- Javascript—③对象
- Springboot starter开发之traceId请求日志链路追踪
- java计算两个时间段的重合天数
- 第二十二章 职业道德规范
- Android ROM DIY之MTK平台手机通用移植 (续)
- winrar 命令行参数使用
- 空间相关分析(三) 局部莫兰指数的理解与计算
- r语言 与python r中python环境的创建
- matlab生成对角占优矩阵,latex对角矩阵diag
- 如何去实现机械灵巧手玩魔方和弹钢琴_我学会了玩魔方
- 记录:2018年CCF优秀博士学位论文奖信息
- 如何使用NFC读卡器读取NFC卡片的UID
- 租借高防服务器和托管高防服务器哪个好?
- 《CSS实战案例汇总》涟漪