优质作者名单
J**A 并发基础知识:Deque 接口和 Queue 接口之间有什么区别? - 程序员古德deque
(双端队列)和queue
(queues) 是 J**A 集合框架中处理元素排队和排队的两个接口,但它们之间存在一些重要差异,如下所示:
1. 队列接口
queue
该接口表示先进先出 (FIFO) 队列,该队列只能从一端添加元素并从另一端删除元素,因此可以使用add()
offer()
将元素添加到队列末尾的方法,使用remove()
poll()
如果尝试从空队列中删除元素,则从队列头部删除元素的方法remove()
方法将被抛出nosuchelementexception
而poll()
方法返回null
2.Deque接口
deque
该接口,即双端队列,允许您从两端添加或删除元素,它提供了两组用于添加和删除元素的方法,一组在队列的头部,另一组在队列的尾部deque
它可以用作队列 (FIFO) 或堆栈 (lifo),用于deque
,可以在队列的头部使用addfirst()
offerfirst()
添加元素,使用removefirst()
pollfirst()
删除元素; 在队列的尾部使用addlast()
offerlast()
添加元素,使用removelast()
polllast()
删除元素,如果尝试从空的双端队列中删除元素,则相关removexxx()
方法也被抛出nosuchelementexception
而pollxxx()
方法返回null
queue
interface 和deque
接口之间的主要区别在于queue
该接口仅支持在一端添加元素,在另一端删除元素deque
接口支持在两端添加和删除元素deque
该接口功能更强大,因为它可以用作队列、堆栈或双端队列queue
接口只能用作队列。
J**A 并发基础知识:Deque 接口和 Queue 接口之间有什么区别? - 程序员 Goode deque 接口代表一个双端队列,双端队列是一种具有队列和堆栈性质的数据结构,它允许从两端插入和删除元素,从而可以在队列的前面(头)或后面(尾部)添加或删除元素,其主要功能包括:
1. 添加元素:
addfirst(e e)
offerfirst(e e)
:如果队列已满,则在队列的头部插入一个元素addfirst
将被抛出illegalstateexception
而offerfirst
然后返回false
addlast(e e)
offerlast(e e)
:如果队列已满,则在队列末尾插入一个元素addlast
将被抛出illegalstateexception
而offerlast
然后返回false
。2. 删除元素:
removefirst()
pollfirst()
:如果队列为空,则从队列的头部删除并返回元素removefirst
将被抛出nosuchelementexception
而pollfirst
然后返回null
removelast()
polllast()
:如果队列为空,则从队列尾部删除并返回元素removelast
将被抛出nosuchelementexception
而polllast
然后返回null
。3. 检查元素。
getfirst()
peekfirst()
:如果队列为空,则获取但不删除队列头部的元素getfirst
将被抛出nosuchelementexception
而peekfirst
然后返回null
getlast()
peeklast()
:如果队列为空,则获取但不删除队列尾部的元素getlast
将被抛出nosuchelementexception
而peeklast
然后返回null
。deque 接口可用于多种场景,包括:
当需要可用作队列 (FIFO) 或堆栈 (LIFO) 的数据结构时。 在需要高效地在两端添加或删除元素的场景,例如实现撤消重做功能、缓冲区管理等。 作为其他数据结构的底层实现,例如实现自定义堆栈或队列。 下面是一个如何使用 deque 接口的简单示例,如下所示:
import j**a.util.deque;
import j**a.util.linkedlist;
public class dequeexample
输出将为:
deque contents: [element 0 (head), element 1 (head), element 2 (tail)]
removed element from head: element 0 (head)
removed element from tail: element 2 (tail)
head element: element 1 (head)
deque is empty? false
在上面,它被使用了linkedlist
类作为deque
接口实现,因为linkedlist
类实现deque
接口,所以它提供了双端队列的所有操作,在队列中添加一些元素,然后将它们从头和尾部移除,并检查队列的 head 元素是否为空。
表示一种队列数据结构,即一种特殊的线性表,它只允许在表的前端进行删除操作,在表的后端(后方)进行插入操作,这种操作规则也被称为“先进先出”(FIFO),其主要功能包括:
1. 插入元素:
add(e e)
:将指定的元素插入到此队列中(如果它立即可行且不违反容量限制),并在成功时返回true
,如果当前没有可用空间,则将其抛出illegalstateexception
,虽然,在queue
接口实现,此方法通常不会引发异常,因为大多数队列实现都是有界的,但边界通常很大。 offer(e e)
:将指定的元素插入到此队列中(如果它立即可行且不违反容量限制),并在成功时返回true
如果当前没有可用空间,则返回false
。2. 删除元素:
remove()
:删除并返回此队列的头部,如果此队列为空,则引发nosuchelementexception
poll()
:删除并返回到此队列的头部,或返回null
如果此队列为空。 3. 检查元素。
element()
:检索,但不删除此队列的头部,如果此队列为空,则抛出它nosuchelementexception
peek()
:检索,但不删除此队列的头部,或返回null
如果此队列为空。 使用场景
缓冲:当需要有序处理数据时,队列可用作缓冲区,但不必一次处理所有数据,例如,打印任务队列、网络请求队列等。 生产者-消费者问题队列通常用于协调多个线程之间的协作,尤其是在生产者-消费者场景中,生产者将产品放入队列中,消费者将产品从队列中取出进行消费。 广度优先搜索:在图论中,队列用于实现广度优先搜索 (BFS) 算法。 事件驱动系统:队列可用于存储挂起的事件,例如用户界面事件或系统事件。 这是一个简单的queue
接口使用示例,使用linkedlist
类作为实现,如下所示:
import j**a.util.linkedlist;
import j**a.util.queue;
public class queueexample
输出:
initial queue: [apple, banana, cherry]
removed element: apple
queue after removal: [banana, cherry]
head of the queue: banana
iterating over the queue:
banana
cherry
在此示例中,一个queue
用offer
方法插入多个元素,使用poll
方法删除队列的 header 元素并使用peek
方法查看当前队列的 head 元素,最后,使用增强的 for 循环遍历队列中的所有元素。
跟着我,每天学习互联网编程技术——程序员古德结束!