概述
Queue 和 Deque 都是接口。其中 Queue 接口定义的是一个队列,它包含队列的基本操作:入队(enqueue)和出队(dequeue)。
Deque 接口继承自 Queue 接口,表示双端队列(Double-ended queue),同时具备「队列」和「栈」的性质。二者的继承关系如下:
Queue
Queue是一个接口,有如下方法:
代码不多,一共200多行,根据操作可以分为三类:入队、出队和遍历。
入队:add() 和 offer()
二者区别在于:当队列空间已满无法入队时,add() 方法会抛出异常;而 offer() 会返回 false。
出队:remove() 和 poll()
二者区别在于:当队列为空时,remove() 方法会抛出异常,而 poll() 会返回 null。
遍历:element() 和 peek()
element() 和 peek() 都表示检索但不移除队列头部元素,可用于从头开始遍历队列。
二者区别在于:当队列为空时,element() 方法会抛出异常,而 peek() 会返回 null。
抛异常 | 返回值 | |
---|---|---|
insert | add(e) | offer(e) |
remove | remove() | poll() |
examine | element() | peek() |
Deque
Deque 接口继承自 Queue 接口,可以将 Deque 理解为「双端队列 」和「栈(Stack)」的组合。
一般的队列是从尾部插入元素、头部移除元素;而双端队列则可以分别从两端插入元素、两端移除元素。
Deque 接口方法定义如下:
由于 Deque 继承了 Queue 接口,因此 Queue 的方法在 Deque 中也有体现,Deque 定义的方法如下:
Deque 还有几个独有的方法:
removeFirstOccurrence():从该双端队列中移除第一次出现的指定元素;
removeLastOccurrence():从该双端队列中移除最后一次出现的指定元素;
descendingIterator():以相反顺序返回此双端队列中元素的迭代器,可以认为是 iterator() 反过来。
小结
Queue 和 Deque 都可用于表示队列;
Queue 表示基本的队列,包含队列的「入队」和「出队」操作;
Deque 继承自 Queue,除了基本的队列操作,Deque 是一个「双端队列」,可以认为它有两个头、两个尾;而且,Deque 还可以作为一个栈。