【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_ ...
随机推荐
- sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期
问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...
- 分析RESTful API安全性及如何采取保护措施
本文中讨论了API安全性和采用安全措施的重要性,如身份验证,API密钥,访问控制和输入验证. API设计的第一步是撰写接口文档 根据TechTarget(海外IT专业媒体)的定义,RESTful AP ...
- 《菜鸟也要学会C》-和大家聊一聊
简介 为什么要出本系列作品? 怎么学好C? 学完这套课程后,我的编程会怎么样? 1.1为什么要出本系列作品? 随着大部分人喜欢编程,大部分人都有一个毛病,就是想要急切的学完编程.其实这种思想是错误的, ...
- js 数组去重方法
var arr = ['a',1,2,3,'a',4,2,3,1,4,2,8,10,null,'a']; // 方法一 var newArr = [...new Set(arr)]; console. ...
- AJAX异步提交form表单
记录: 网上有说怎么做,没说怎么接收,打印了一下数据,记录一下取值: 比如说有如下form: <form id="form1" name="form1" ...
- Linux实例/etc/fstab文件配置错误导致系统启动异常
Centos 7.3系统 问题现象: 阿里云ECS升级配置后重启,SSH连接不上.登录控制台远程连接ECS,出现以下界面. 提交工单阿里云反馈:https://help.aliyun.com/kno ...
- java日期在今天的基础上加一个月。并计算时间相差天数
Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, 1); ...
- mysql的数据存储
# pycharm 连接mysql import pymysql username = input("输入用户名:") pwd = input("输入密码:") ...
- c++字符数组
题目描述 题目描述 输入一个英文句子(长度不会超过100),和他的长度,统计每个字母出现的个数. 输入 第一行包括一个整数,表示句子的长度,长度不会超过100.数字后可能会有多余的无效字符 请gets ...
- BZOJ3033 太鼓达人题解
太鼓达人 时间限制: 1 Sec 内存限制: 128 MB 题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是 ...