【常用的队列总结】

文章目录

  • 队列的介绍
    • 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.rhkb.cn/news/333409.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知攻善防应急响应靶机训练-Web3

前言 本次应急响应靶机采用的是知攻善防实验室的Web-3应急响应靶机 靶机下载地址为: https://pan.quark.cn/s/4b6dffd0c51a 相关账户密码 用户:administrator 密码:xj123456xj123456 解题过程 第一题-攻击者的两个IP地址 直接查看apache的log日志搜索.php 发现…

【学习笔记】Windows GDI绘图目录

题外话 不知几时开始,觉得学习过程中将内容记录下来,有助于加强记忆,还方便后续查找,顺便帮助有需要的人,更有来自您阅读、点赞、收藏和评论时给我带来的动力与兴奋。 目录 【学习笔记】Windows GDI绘图(一)图形概述…

Python操作MySQL数据库的工具--sqlalchemy

文章目录 一、pymysql和sqlalchemy的区别二、sqlalchemy的详细使用1.安装库2.核心思想3.整体思路4.sqlalchemy需要连接数据库5.使用步骤1.手动提前创建数据库2.使用代码创建数据表3.用代码操作数据表3.1 增加数据3.2 查询数据3.3 删除数据3.4 修改数据 一、pymysql和sqlalchemy…

vs code怎么补全路径,怎么快捷输入文件路径

安装插件: 链接:https://marketplace.visualstudio.com/items?itemNamejakob101.RelativePath 使用 按住 Ctrl Shift H,弹出窗口,输入文件补全,回车就可以了 排除文件 如果你的项目下文件太多,它会…

Ubuntu22.04之解决:忘记登录密码(二百三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

有哪些永久免费的进销存管理软件?

我明白许多中小企业在寻求进销存系统时,希望能找到一款完全免费的解决方案,以减轻经济压力。这种心态非常正常,毕竟成本是任何企业都需要仔细考虑的因素。然而,我要强调的是,市场上那些声称“完全免费”的进销存系统&a…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题:使用Jackson将一个超级大的JSON字符串转换POJO失败,debug看没问题,将JSON字符串粘贴到main方法中测试,提示错误信息如下: 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

BFS解决最短路问题(详解)

目录 BFS简介 && 框架: 一.二叉树的最小深度 二:迷宫中里入口最近的出口: 三.最小基因变化: 四:单词接龙: ​五:为高尔夫比赛砍树: BFS简介 && 框架: 说到BFS…

linux centos tomcat启动内存泄漏

tomcat启动内存泄漏 经过与开发沟通,结果是开发写了死循环,导致内存泄漏,上一次是开发少打了一个jar包,让开发查代码就行,重新更新代码

【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Elasticsearch之文本分析

文本分析基本概念 官网:Text analysis | Elasticsearch Guide [7.17] | Elastic 官网称为文本分析,这是对文本进行一直分析处理的方式,基本处理逻辑是为按照预先制定的分词规则,把原本的文档进行分割成多个小颗粒度的词项&#x…

每天五分钟深度学习框架pytorch:tensor张量的维度转换大全

本文重点 在深度学习中比较让人头疼的一点就是矩阵的维度,我们必须构建出符合神经网络维度的矩阵,只有将符合要求的矩阵放到神经网络中才可以运行神经网络,本节课程我们将学习以下tensor中维度的变化。 view和shape View和shape,这两个方法可以完成维度的变换操作,而且使…

如何在anaconda的环境下安装langchain

1、安装anaconda; 2、在终端上,输入: conda install langchain -c conda-forge Proceed ([y]/n)? y 输入:Y 3、安装完成后,输入: python -c "import langchain; print(langchain.__version__)&…

OpenBayes 一周速览|TripoSR 开源:1 秒即 2D 变 3D、经典 GTZAN 音乐数据集上线

公共资源速递 This Weekly Snapshots !5 个数据集: FER2013 面部表情识别数据集 GTZAN 音乐流派分类数据集 MVTec-AD 工业异常检测数据集 UCAS-AOD 遥感目标检测数据集 Oxford 102 Flowers 花卉图片数据集 3 个教程: Latte 全球首个开…

linux 查看csv文件,按指定列聚合 排序

在Linux中,你可以使用awk工具来查看CSV文件的内容,并按照指定的列进行聚合。awk是一种强大的文本处理工具,它可以处理文本文件中的数据,并根据条件执行相应的操作。 以下是一个示例,假设你有一个名为data.csv的CSV文件…

spring boot3整合邮件服务实现邮件发送功能

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 内容概要 开通服务 依赖引入 配置属性 创建邮件发送工具类 测试 最近发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

linux 中 fd 申请和释放管理(两级 bitmap)

linux 中 fd 的几点理解_linux fd-CSDN博客 通过上边的文章,我们可以知道,在 linux 中,fd 有以下几点需要了解: (1)fd 表示进程打开的文件,是进程级别的资源,不是系统级别的资源 …

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作,之前文章中介绍过,卷积核filter往往都是3x3或者5x5什么的,但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

【Redis】持久化操作详解

Redis 持久化操作详解 Redis 实现持久化的时候,具体是按照什么样的策略来实现的呢? Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种&…

网络原理-HTTP协议

HTTP协议 HTTP协议全称为超文本传输协议,除了能传输字符串,还能传输图片、视频、音频等。 当我们在访问网页的时候,浏览器会从服务器上下载数据,这些数据都会放在HTTP响应中,然后浏览器再根据这个HTTP响应显示出网页信息。 抓包 抓包工具本质上是一个代理工具,即我们将构造…