【JDK】JDK源码-Queue, Deque
概述
Queue 和 Deque 都是接口。其中 Queue 接口定义的是一个队列,它包含队列的基本操作:入队(enqueue)和出队(dequeue)。
Deque 接口继承自 Queue 接口,表示双端队列(Double-ended queue),同时具备「队列」和「栈」的性质。二者的继承关系如下:
PS: 图中还包括阻塞队列 BlockingQueue 和 BlockingDeque,这里暂不分析。
Queue
Queue 接口定义如下:
它定义了 6 个方法,根据操作可以分为三类:入队、出队和遍历。
1. 入队:add() 和 offer()
二者区别在于:当队列空间已满无法入队时,add() 方法会抛出异常;而 offer() 会返回 false。
2. 出队:remove() 和 poll()
二者区别在于:当队列为空时,remove() 方法会抛出异常,而 poll() 会返回 null。
3. 遍历:element() 和 peek()
element() 和 peek() 都表示检索但不移除队列头部元素,可用于从头开始遍历队列。
二者区别在于:当队列为空时,element() 方法会抛出异常,而 peek() 会返回 null。
Queue 接口的几个方法可归纳如下:
Throws exception |
Returns special value |
|
Insert |
add(e) |
offer(e) |
Remove |
remove() |
poll() |
Examine |
element() |
peek() |
Deque
Deque 接口继承自 Queue 接口,可以将 Deque 理解为「双端队列 」和「栈(Stack)」的组合。
PS: 根据前面「数据结构与算法笔记(一)」的概念,该栈是一个「链式栈」。
一般的队列是从尾部插入元素、头部移除元素;而双端队列则可以分别从两端插入元素、两端移除元素。
Deque 接口方法定义如下:
Deque 作为双端队列,其定义的方法可以归纳如下:
First Element (Head) |
Last Element (Tail) |
|||
Throws exception |
Special value |
Throws exception |
Special value |
|
Insert |
addFirst(e) |
offerFirst(e) |
addLast(e) |
offerLast(e) |
Remove |
removeFirst() |
pollFirst() |
removeLast() |
pollLast() |
Examine |
getFirst() |
peekFirst() |
getLast() |
peekLast() |
由于 Deque 继承了 Queue 接口,因此 Queue 的方法在 Deque 中也有体现,而且与 Deque 定义的方法存在如下对应关系:
Queue Method |
Equivalent Deque Method |
add(e) |
addLast(e) |
offer(e) |
offerLast(e) |
remove() |
removeFirst() |
poll() |
pollFirst() |
element() |
getFirst() |
peek() |
peekFirst() |
此外,Deque 还可以作为栈,有关栈的操作和在 Deque 中的对应方法如下:
Stack Method |
Equivalent Deque Method |
push(e) |
addFirst(e) |
pop() |
removeFirst() |
peek() |
peekFirst() |
Deque 还有几个独有的方法:
1. removeFirstOccurrence()
从该双端队列中移除第一次出现的指定元素;
2. removeLastOccurrence()
从该双端队列中移除最后一次出现的指定元素;
3. descendingIterator()
以相反顺序返回此双端队列中元素的迭代器,可以认为是 iterator() 反过来。
小结
1. Queue 和 Deque 都可用于表示队列;
2. Queue 表示基本的队列,包含队列的「入队」和「出队」操作;
3. Deque 继承自 Queue,除了基本的队列操作,Deque 是一个「双端队列」,可以认为它有两个头、两个尾;而且,Deque 还可以作为一个栈。
Stay hungry, stay foolish.
PS: 本文首发于微信公众号。
【JDK】JDK源码-Queue, Deque的更多相关文章
- JDK部分源码阅读与理解
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK ...
- JDK Collection 源码分析(2)—— List
JDK List源码分析 List接口定义了有序集合(序列).在Collection的基础上,增加了可以通过下标索引访问,以及线性查找等功能. 整体类结构 1.AbstractList 该类作为L ...
- JDK AtomicInteger 源码分析
@(JDK)[AtomicInteger] JDK AtomicInteger 源码分析 Unsafe 实例化 Unsafe在创建实例的时候,不能仅仅通过new Unsafe()或者Unsafe.ge ...
- Eclipse导入jdk的源码
eclipse导入JDK源码 前言:这件事情的重要性不言而喻,对于学习和观摩优秀的代码非常的有用,我喜欢想看什么代码都能 Ctrl+鼠标一点 就能够看到,不过这个不常操作,在这里小记一笔,以备后用.( ...
- Android Studio 关联 JDK Java 源码
Android Studio 关联 Android 源码比较方便,一般下载后可自动关联,但是 Android Studio 默认使用的 JDK 是内嵌的,是不带源码的.所以在查看 JDK 源码时,看到 ...
- 配置Eclipse可以查看JDK类库源码
一.配置方法 配置Eclipse可以查看JDK类库源码 Window->Preferences->Java->Installed JREs 若没有JRE,需要自己添加进来,有的话,点 ...
- deque源码4(deque元素操作:pop_back、pop_front、clear、erase、insert)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
- deque源码3(deque的构造与内存、ctor、push_back、push_front)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
- deque源码2(deque迭代器、deque的数据结构)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
随机推荐
- Python自学day-4
一.字符串转为字典(eval):也可以用于转列表.集合等 s1 = "['name','leo']" s_list = eval(s1) #字符串转换为列表 print(s_lis ...
- 手动实现 SpringMVC
前几章我们已经分析了 Spring 的源码并且手动实现了一个 IOC/DI 容器. 这章我们在自己实现的 Spring 框架的基础上实现一个 SpringMVC 框架. 我们自己实现的 Spring ...
- 【java】MD5加密工具
MD5: /** * 对指定字段进行MD5加密 * 参数为空或发生异常都会返回 @PASE-_FAIL (-1) * @author ZX * @date 2018年09月10日16:03:07 * ...
- java写出PDF
1\包 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</ar ...
- HTTP协议之应用
通过对http协议的理解.我们可以根据这些特性来进行一些应用. 1.我们可以根据http请求的头信息refer信息,我们可以来做网站的防盗链.refer记录访问到目标网站的上次访问路径.这样我们可以来 ...
- 带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍
概述 首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让 ...
- Oracle 数据库表中已有重复数据添加唯一键(唯一约束)
Oracle 数据库表中已有重复数据添加唯一键(唯一约束) 问题描述 以 demo 举例,模拟真实场景. 表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引 ID C ...
- 解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics
背景 接上一篇 快速搭建 Windows Kubernetes , 我们发现原来在 Windows Kubernetes 会有一些与在 Linux 上使用不一样的体验,俗称坑,例如 hostAlias ...
- c++书籍推荐《C++编码规范》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++编程规范:101条规则.准则与 实践>:良好的编程规范可以改善软件质量,缩短上市时间,提升团队效率,简化维护工作.在<C++编程规范 ...
- Docker学习第二天
CentOS 系列安装 Docker Docker 支持 CentOS6 及以后的版本. CentOS6 对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下 [root@MSJT ...