Java 并发基础知识 Deque 接口和队列接口之间有什么区别?

小夏 科技 更新 2024-02-08

优质作者名单

J**A 并发基础知识:Deque 接口和 Queue 接口之间有什么区别? - 程序员古德deque(双端队列)和queue(queues) 是 J**A 集合框架中处理元素排队和排队的两个接口,但它们之间存在一些重要差异,如下所示:

1. 队列接口

queue该接口表示先进先出 (FIFO) 队列,该队列只能从一端添加元素并从另一端删除元素,因此可以使用add()offer()将元素添加到队列末尾的方法,使用remove()poll()如果尝试从空队列中删除元素,则从队列头部删除元素的方法remove()方法将被抛出nosuchelementexceptionpoll()方法返回null

2.Deque接口

deque该接口,即双端队列,允许您从两端添加或删除元素,它提供了两组用于添加和删除元素的方法,一组在队列的头部,另一组在队列的尾部deque它可以用作队列 (FIFO) 或堆栈 (lifo),用于deque,可以在队列的头部使用addfirst()offerfirst()添加元素,使用removefirst()pollfirst()删除元素; 在队列的尾部使用addlast()offerlast()添加元素,使用removelast()polllast()删除元素,如果尝试从空的双端队列中删除元素,则相关removexxx()方法也被抛出nosuchelementexceptionpollxxx()方法返回null

queueinterface 和deque接口之间的主要区别在于queue该接口仅支持在一端添加元素,在另一端删除元素deque接口支持在两端添加和删除元素deque该接口功能更强大,因为它可以用作队列、堆栈或双端队列queue接口只能用作队列。

J**A 并发基础知识:Deque 接口和 Queue 接口之间有什么区别? - 程序员 Goode deque 接口代表一个双端队列,双端队列是一种具有队列和堆栈性质的数据结构,它允许从两端插入和删除元素,从而可以在队列的前面(头)或后面(尾部)添加或删除元素,其主要功能包括:

1. 添加元素:

addfirst(e e)offerfirst(e e):如果队列已满,则在队列的头部插入一个元素addfirst将被抛出illegalstateexceptionofferfirst然后返回falseaddlast(e e)offerlast(e e):如果队列已满,则在队列末尾插入一个元素addlast将被抛出illegalstateexceptionofferlast然后返回false。2. 删除元素:

removefirst()pollfirst():如果队列为空,则从队列的头部删除并返回元素removefirst将被抛出nosuchelementexceptionpollfirst然后返回nullremovelast()polllast():如果队列为空,则从队列尾部删除并返回元素removelast将被抛出nosuchelementexceptionpolllast然后返回null。3. 检查元素。

getfirst()peekfirst():如果队列为空,则获取但不删除队列头部的元素getfirst将被抛出nosuchelementexceptionpeekfirst然后返回nullgetlast()peeklast():如果队列为空,则获取但不删除队列尾部的元素getlast将被抛出nosuchelementexceptionpeeklast然后返回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():删除并返回此队列的头部,如果此队列为空,则引发nosuchelementexceptionpoll():删除并返回到此队列的头部,或返回null如果此队列为空。 3. 检查元素。

element():检索,但不删除此队列的头部,如果此队列为空,则抛出它nosuchelementexceptionpeek():检索,但不删除此队列的头部,或返回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

在此示例中,一个queueoffer方法插入多个元素,使用poll方法删除队列的 header 元素并使用peek方法查看当前队列的 head 元素,最后,使用增强的 for 循环遍历队列中的所有元素。

跟着我,每天学习互联网编程技术——程序员古德结束!

相似文章

    Java 并发基础知识 CountDownLatch 全面分析!

    优质作者名单 j a 并发基础知识 CountDownLatch 完整分析!程序员古德countdownlatch优点是可以简洁高效地协调多个线程的执行顺序,保证只有一组线程完成后才会触发其他线程的执行,适用于资源加载 任务初始化等场景。它提供了清晰的等待通知机制,易于理解和使用,是提高多线程程序性...

    Java 并发基础知识 CyclicBarrier 分析!

    优质作者名单 J A 并发基础 CyclicBarrier 的综合分析!CyclicBarrier 的优势在于实现了线程之间的相互等待和协作,保证了所有线程只有在到达预定的障碍点后才能继续执行,它支持障碍的复用,非常适合多轮次任务同步,此外,CyclicBarrier 还允许在障碍点执行特定的操作,...

    Java 并发基础知识 Phaser 全面分析!

    优质作者名单 J A 并发基础知识 移相器综合分析!Programmer Goode Phaser 是 J a 中一款灵活的同步工具,它的优点是支持多阶段任务拆分和同步,并且可以动态注册和注销参与者,它提供了丰富的等待和推送机制,让开发者可以更细粒度的方式控制线程的协调行为,实现复杂的并行任务处理,...

    Java 并发同步原理高级

    故事人物。老王 JVM Xiao Nan 线程.小女孩 线程。房间 对象。在房间的门上 防盗锁 显示器重量级锁。房间上门 小楠书包 轻量锁。在房间的门上 刻有小南的名字 偏置锁 该物体是线程独有的。批量重新写入 一类偏置锁撤销达到 阈值 批量重新偏置。无法雕刻名称 批量撤销对此类对象的偏差锁定,并将...

    Java Core Fundamentals 揭示 Iterable 接口和 Iterator 接口之间的核心区别!

    j A 核心基础知识 揭示可迭代接口和迭代器接口的核心区别!程序员 Goode in j a,iterableinterface 和iterator接口都用于循环访问集合中的元素,但它们的使用方式和功能不同。官方文件门户 .可迭代接口 iterable接口是用于实现能够对其元素执行 for each...