【常用的队列总结】

news2024/11/17 5:36:47

文章目录

  • 队列的介绍
    • Queue队列的基本概念与操作
    • 队列的基本概念
  • 常见的队列介绍
    • 非阻塞队列
      • LinkedList:
      • ArrayDeque:
      • PriorityQueue:
    • 阻塞队列
      • ArrayBlockingQueue
      • LinkedBlockingQueue
      • PriorityBlockingQueue
    • DelayQueue
      • SynchronousQueue

队列的介绍

Queue队列的基本概念与操作

在 Java 中,队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。队列通常用于在数据集合中添加元素,并按照它们被添加的顺序移除元素。Java 提供了丰富的队列实现,可以满足不同场景下的需求。

队列的基本概念

队列是一种线性数据结构,它有两个基本操作:入队(enqueue)和出队(dequeue)。入队将元素添加到队列的末尾,而出队则从队列的头部获取并移除元素。因此,队列的特点是先进先出,即最先入队的元素最先出队。

常见的队列介绍

非阻塞队列

LinkedList:

在这里插入图片描述
LinkedList 是 Java 中实现了 List 接口的类,它基于双向链表数据结构实现了列表的操作。除了实现了 List 接口之外,LinkedList 还实现了 Queue 接口,因此也可以用作队列。
LinkedList的特点:
1.双向链表结构:每个节点都包含指向前一个节点和后一个节点的引用,这使得在任意位置插入或删除元素的操作都是高效的。
2.非线程安全:LinkedList 不是线程安全的,如果需要在多线程环境中使用,需要通过额外的同步手段来保证线程安全性。
常用的方法:

添加元素:
add(E e): 将指定元素添加到列表末尾。
add(int index, E element): 在指定位置插入元素。
获取元素:
get(int index): 返回列表中指定位置的元素。
getFirst(): 返回列表中的第一个元素。
getLast(): 返回列表中的最后一个元素。
删除元素:
remove(): 移除并返回列表中的第一个元素。
remove(int index): 移除列表中指定位置的元素。
removeFirst(): 移除并返回列表中的第一个元素。
removeLast(): 移除并返回列表中的最后一个元素。
队列操作:
offer(E e): 将指定元素添加到队列的尾部。
poll(): 移除并返回队列的头部元素。
peek(): 返回队列的头部元素,但不移除。
判断元素是否存在:
contains(Object element):检查链表是否包含指定元素。
获取链表大小和清空链表:
size():获取链表中元素的个数。
isEmpty():检查链表是否为空。
clear():清空链表中的所有元素。
栈操作(LIFO):
push(E e): 将元素压入栈(等同于 addFirst(E e))。
pop(): 移除并返回栈顶元素(等同于 removeFirst())。

ArrayDeque:

在这里插入图片描述
ArrayDeque 是 Java 中实现了 Deque 接口的类,是一个基于数组的双端队列。它在两端进行插入和删除操作都非常高效,是实现栈和队列操作的理想选择。ArrayDeque 可以用作栈、队列或双端队列。
ArrayDeque的特点:
1.双端队列:可以在队列的两端进行添加和删除操作。
2.基于数组:内部使用数组来存储元素,初始容量可以动态调整。
3.无界队列:可以根据需要自动扩容,因此不限制大小。
4.线程不安全:不是线程安全的,在多线程环境中使用时需要外部同步。
5.高效:相比 LinkedList,ArrayDeque 的性能更高,因为它没有节点的额外开销。
常用方法:

添加元素:
addFirst(E e): 在队列头部添加元素。
addLast(E e): 在队列尾部添加元素。
offerFirst(E e): 在队列头部添加元素,返回 true 如果添加成功。
offerLast(E e): 在队列尾部添加元素,返回 true 如果添加成功。
获取元素:
getFirst(): 获取队列头部的元素。
getLast(): 获取队列尾部的元素。
peekFirst(): 获取但不移除队列头部的元素,返回 null 如果队列为空。
peekLast(): 获取但不移除队列尾部的元素,返回 null 如果队列为空。
删除元素:
removeFirst(): 移除并返回队列头部的元素。
removeLast(): 移除并返回队列尾部的元素。
pollFirst(): 移除并返回队列头部的元素,返回 null 如果队列为空。
pollLast(): 移除并返回队列尾部的元素,返回 null 如果队列为空。
栈操作(LIFO):
push(E e): 将元素压入栈(等同于 addFirst(E e))。
pop(): 移除并返回栈顶元素(等同于 removeFirst())。

PriorityQueue:

在这里插入图片描述
PriorityQueue 是 Java 中提供的一个基于优先级堆实现的队列,它可以确保每次出队(移除)操作总是返回队列中优先级最高的元素。它在需要频繁访问和删除优先级最高的元素的场景下非常有用。

PriorityQueue的特点:
1.基于堆:PriorityQueue 使用二叉堆(通常是最小堆)实现,能够提供对最小(或最大)元素的高效访问和删除。
2.自然顺序或自定义顺序:可以按照元素的自然顺序(实现 Comparable 接口)或通过指定的 Comparator 进行排序。
3.无界队列:默认情况下是无界的,但其内部容量会根据需要自动扩展。
4.线程不安全:不是线程安全的,如果在多线程环境中使用,需要额外的同步。
5.元素排序:插入元素后不会保持队列的顺序,但在访问时总是返回优先级最高的元素。
常用方法:

添加元素:
add(E e): 将指定元素插入优先级队列,若插入失败抛出异常。
offer(E e): 将指定元素插入优先级队列,返回 true 如果插入成功。
获取元素:
peek(): 返回队列头部的元素(优先级最高的元素),但不移除,如果队列为空返回 null。
删除元素:
poll(): 移除并返回队列头部的元素(优先级最高的元素),如果队列为空返回 nullremove(Object o): 从队列中移除指定元素。
其他操作:
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

阻塞队列

ArrayBlockingQueue

在这里插入图片描述
ArrayBlockingQueue 是 Java 中的一种阻塞队列实现,它基于数组并具有固定容量。它在队列满或队列空时会使得相应的插入或移除操作阻塞,是在生产者-消费者场景中常用的一个类。
特点:
1.固定容量:ArrayBlockingQueue 在创建时必须指定容量。
2.线程安全:内部使用锁和条件变量来控制并发访问,确保线程安全。
3.FIFO顺序:元素按先进先出(FIFO)的顺序进行插入和删除。
常用方法:

添加元素
add(E e): 将指定元素插入队列,如果队列已满,则抛出 IllegalStateExceptionoffer(E e): 将指定元素插入队列,如果队列已满,则返回 falseput(E e): 将指定元素插入队列,如果队列已满,则阻塞直到有可用空间。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。
remainingCapacity(): 返回队列剩余的可用容量。

LinkedBlockingQueue

在这里插入图片描述
LinkedBlockingQueue 是 Java 中的一种阻塞队列实现,它基于链接节点(链表)并且可以选择有界或无界。它在多线程环境下非常适合用来实现生产者-消费者模型,因为它支持阻塞的插入和移除操作。
特点:
1.有界或无界:可以在初始化时指定容量,未指定时默认最大容量为 Integer.MAX_VALUE。
2.线程安全:使用独立的锁来控制插入和删除操作,确保线程安全。
3.FIFO顺序:元素按先进先出(FIFO)的顺序进行插入和删除。
4.高吞吐量:由于插入和删除操作使用了独立的锁,可以在多线程环境中提供较高的吞吐量。
常用方法:

添加元素
add(E e): 将指定元素插入队列,如果队列已满,则抛出 IllegalStateExceptionoffer(E e): 将指定元素插入队列,如果队列已满,则返回 falseput(E e): 将指定元素插入队列,如果队列已满,则阻塞直到有可用空间。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,在指定时间内等待可用空间,如果队列已满且超时,则返回 false。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,在指定时间内等待,如果队列为空且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。
remainingCapacity(): 返回队列剩余的可用容量。

PriorityBlockingQueue

在这里插入图片描述
PriorityBlockingQueue 是 Java 中的一种阻塞队列实现,它基于优先级堆实现,元素按自然顺序或指定的比较器顺序进行排序。与普通的阻塞队列不同,PriorityBlockingQueue 中的元素不是按照插入顺序进行处理,而是按照优先级顺序进行处理。这使得它非常适合需要处理优先级任务的场景。
特点:
1.无界队列:PriorityBlockingQueue 是一个无界队列,其容量为 Integer.MAX_VALUE。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.元素排序:元素按自然顺序(通过 Comparable 接口)或指定的比较器进行排序。
4.阻塞操作:在获取元素时会阻塞直到有可用元素。
常用方法:

添加元素
add(E e): 将指定元素插入队列。
offer(E e): 将指定元素插入队列。
put(E e): 将指定元素插入队列(由于队列无界,此方法实际上不会阻塞)。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间(由于队列无界,此方法实际上不会阻塞)。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,等待指定时间,如果队列为空且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

DelayQueue

在这里插入图片描述
DelayQueue 是 Java 中的一种阻塞队列实现,它适用于在一段时间之后才能获取元素的场景。队列中的元素必须实现 Delayed 接口,并在指定的延迟期满之后才能从队列中获取到。这使得 DelayQueue 特别适用于实现任务调度和超时任务处理等功能。
特点:
1.无界队列:DelayQueue 是一个无界队列,其容量为 Integer.MAX_VALUE。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.基于时间的排序:元素根据剩余的延迟时间进行排序,延迟时间最短的元素优先处理。
4.元素必须实现 Delayed 接口:队列中的元素需要实现 getDelay(TimeUnit unit) 和 compareTo(Delayed o) 方法。
常用方法:

添加元素
add(E e): 将指定元素插入队列。
offer(E e): 将指定元素插入队列。
put(E e): 将指定元素插入队列(由于队列无界,此方法实际上不会阻塞)。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间(由于队列无界,此方法实际上不会阻塞)。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空或头部元素的延迟时间未到,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空或头部元素的延迟时间未到,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空或头部元素的延迟时间未到,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,等待指定时间,如果队列为空或头部元素的延迟时间未到且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

SynchronousQueue

在这里插入图片描述
SynchronousQueue 是 Java 中的一种特殊的阻塞队列实现,它没有内部容量或者缓冲区,每一个 put 操作必须等待一个对应的 take 操作,反之亦然。这意味着在 SynchronousQueue 中,元素只能在生产者和消费者线程之间直接传递。
特点:
1.无容量:SynchronousQueue 没有容量,无法缓存元素。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.直接传递:每个插入操作必须等待一个移除操作,反之亦然。
4.适用于移交:特别适用于需要在线程之间移交任务的场景。
常用方法:

添加元素
put(E e): 将指定元素插入队列,如果没有相应的取出操作,则阻塞。
offer(E e): 将指定元素插入队列,如果没有相应的取出操作,则返回 falseoffer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间,如果没有相应的取出操作,则返回 false。
获取元素
take(): 获取并移除队列中的元素,如果没有相应的插入操作,则阻塞。
poll(): 获取并移除队列中的元素,如果没有相应的插入操作,则返回 nullpoll(long timeout, TimeUnit unit): 获取并移除队列中的元素,等待指定时间,如果没有相应的插入操作,则返回 null。
其他操作
size(): 始终返回 0,因为 SynchronousQueue 不存储任何元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux用docker安装ElasticsearchSpringBoot整合ES

一. 部署Elasticsearch 1. docker查询docker容器中的es docker search elasticsearch 2. 安装(PS:查看自己的springBoot的版本号 对应的es版本安装) docker pull elasticsearch:7.6.23. 查看已安装的docker镜像 docker images4. 创建挂…

【会议征稿,SPIE独立出版】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)

第五届计算机视觉与数据挖掘国际学术会议(ICCVDM 2024)将于2024年7月19-21日在中国长春举行。此前,ICCVDM系列会议于2020年在中国西安、2021年在中国长沙(线上)、2022年在中国呼伦贝尔(线上线下&#xff09…

【Java】JavaSE概述

1、简介 Java SE(Java Platform, Standard Edition)是Java技术的核心平台,它提供了Java编程语言、Java虚拟机(JVM)以及Java核心类库和API。Java SE主要用于开发和部署桌面应用程序、服务器应用程序、命令行工具和嵌入…

DBeaver怎么将编辑栏内容放大

1、窗口–》编辑器–》放大 2、ctrl 3、页面结果展示

前端大师-高级Web开发测验

目录 前言 1.按正确的执行顺序排列脚本 2.哪些说法是正确的?(D) 3.填写正确的术语 4.程序的输出 5.将资源提示与其定义匹配 6.以下程序的输出是? 7.将PerformanceNavigationTimings按正确的顺序排列 8.将缓存指令与其定义…

【动手学PaddleX】谁都能学会的基于迁移学习的老人摔倒目标检测

本项目使用PaddleX搭建目标检测模块,在一个精选的数据集上进行初步训练,并在另一个老年人跌倒检测的数据集上进行参数微调,实现了迁移学习的目标检测项目。 1.项目介绍 迁移学习是非常有用的方法,在实际生活中由于场景多样&…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

osg的了解

osg开发配置与第一个osg程序-CSDN博客 #include <osg/Geode> #include <osg/ShapeDrawable> #include <osgViewer/Viewer> #include <iostream>int main(int argc, char** argv) {std::cout << "Hello, osg!" << std::endl;osg:…

加速模型训练 GPU cudnn

GPU的使用 在定义模型时&#xff0c;如果没有特定的GPU设置&#xff0c;会使用 torch.nn.DataParallel 将模型并行化&#xff0c;充分利用多GPU的性能&#xff0c;这在加速训练上有显著影响。 model torch.nn.DataParallel(model).cuda() cudnn 的配置&#xff1a; cudnn.…

MER 2024 第二届多模态情感识别挑战赛

多模态情感识别是人工智能领域的一个活跃研究课题。它的主要目标是整合多种模态来识别人类的情绪状态。当前的工作通常为基准数据集假设准确的情感标签&#xff0c;并专注于开发更有效的架构。然而&#xff0c;现有技术难以满足实际应用的需求。 清华大学陶建华教授联合中国科学…

体育赛事直播系统源码开发:社区论坛模块如何实现引流与增收双赢

在当今数字化时代&#xff0c;体育直播平台不仅是赛事观看的窗口&#xff0c;更是一个互动和交流的社区&#xff0c;以及是一场关于用户体验、用户粘性以及商业模式创新的综合较量。为了在这片红海市场中脱颖而出&#xff0c;平台必须采取更加精细化和多元化的运营策略。其中&a…

2024最新下载kettle方法

1.点击链接进入官网 Pentaho from Hitachi Vantara download | SourceForge.netDownload Pentaho from Hitachi Vantara for free. End to end data integration and analytics platform. Pentaho Community Edition can now be downloaded from https://www.hitachivantara.…

python中import的搜索路径

文章目录 前言 一 python中import的搜索路径1. python中import的搜索路径先判断是否内置模块根据sys.path查找1.1 脚本当前目录和所属项目目录1.2 环境变量1.3 标准库1.4 .pth 文件1.5 第三方库 2. 解决ModuleNotFoundError 前言 码python时经常会遇到找不到包或者找不到模块的…

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上&#xff08;2024年5月20日至23日&#xff09;&#xff0c;杰出化合物半导体材料企业Brewer Science&#xff0c;将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲&#xff0c;定于五月二十一日星…

今日好料推荐(数据资产+数字化案例)

今日好料推荐&#xff08;数据资产数字化案例&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 数字化的介绍 数字化&#xff08;Digitization&#xff09;是指将模拟信息转换为数字格式的过程。这一过程包括将文字、图像、音频、视频等信息转…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…

SwiftUI中TabView(PageTabViewStyle的用法及无限滚动组件infinity carousel)

上一篇文章主要介绍了TabView的基本用法以及一些外观样式的设置&#xff0c;本篇文章主要介绍一下PageTabViewStyle样式下的TabView&#xff0c;该样式下的TabView允许用户整页滑动界面&#xff0c;在UIKit中我们用UIScrollView和UICollectionView制作滚动组件&#xff0c;本文…

C++进阶 | [4] map and set

摘要&#xff1a;set&#xff0c;multiset&#xff0c;map&#xff0c;multimap 前言 1. 容器 序列式容器&#xff1a;只存储数据&#xff0c;数据之间无关联关系。例如&#xff0c;vector、list、deque、……关联式容器&#xff1a;不仅存储数据&#xff0c;且数据之间有关联…

Chrome谷歌浏览器如何打开不安全页面的禁止权限?

目录 一、背景二、如何打开不安全页面被禁止的权限&#xff1f;2.1 第一步&#xff0c;添加信任站点2.2 第二步&#xff0c;打开不安全页面的权限2.3 结果展示 一、背景 在开发过程中&#xff0c;由于测试环境没有配置 HTTPS 请求&#xff0c;所以谷歌浏览器的地址栏会有这样一…

《Python侦探手册:用正则表达式破译文本密码》

在这个信息爆炸的时代&#xff0c;每个人都需要一本侦探手册。阿佑今天将带你深入Python的正则表达式世界&#xff0c;教你如何像侦探一样&#xff0c;用代码破解文本中的每一个谜题。从基础的字符匹配到复杂的数据清洗&#xff0c;每一个技巧都足以让你在文本处理的领域中成为…