前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK源码-Queue, Deque

JDK源码-Queue, Deque

作者头像
WriteOnRead
发布2019-08-16 17:03:22
3760
发布2019-08-16 17:03:22
举报
文章被收录于专栏:WriteOnReadWriteOnRead

概述

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.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WriteOnRead 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档