Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列

写在开头

队列是Java中的一个集合接口,之前的文章已经讲解了List和Set,那么今天就来唠一唠它吧。队列的特点:存储的元素是有序的、可重复的。

队列的两大接口Queue vs Deque

Queue 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则。

Queue 接口抛出异常返回特殊值
插入队尾add(E e)offer(E e)
删除队首remove()poll()
查询队首元素element()peek()

Deque 是双端队列,在队列的两端均可以插入或删除元素。

Deque 接口抛出异常返回特殊值
插入队首addFirst(E e)offerFirst(E e)
插入队尾addLast(E e)offerLast(E e)
删除队首removeFirst()pollFirst()
删除队尾removeLast()pollLast()
删除队首removeFirst()pollFirst()
查询队首元素getFirst()peekFirst()
查询队尾元素getLast()peekLast()

ArrayDeque

作为双端队列的实现类,是基于可变长的数组和双指针来实现,常常被用于实现栈功能,以此来替代曾经那个笨拙的Stack。

【代码示例1】

 // 创建一个ArrayDequeArrayDeque<String> deque = new ArrayDeque<>();// 添加元素deque.add("a");deque.add("b");deque.add("c");// 删除元素deque.remove("b");// 修改元素deque.remove("b");deque.add("bb");// 查找队首元素System.out.println(deque.getFirst());//查找队尾元素System.out.println(deque.getLast());//遍历队列for (String s : deque) {System.out.print(s);}

输出:

a
bb
acbb

PriorityQueue

作为Queue的子类,它的特点是元素出队顺序是与优先级相关,利用二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据,默认是小顶堆,但可以接收一个 Comparator 作为构造参数,从而来自定义元素优先级的先后。

【代码示例2】

public class Test {public static void main(String[] args) {// 创建 PriorityQueue 对象PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();// 添加元素到 PriorityQueuepriorityQueue.offer(3);priorityQueue.offer(2);priorityQueue.offer(1);priorityQueue.offer(4);priorityQueue.offer(5);priorityQueue.offer(6);// 打印 PriorityQueue 中的元素System.out.println("PriorityQueue 中的元素:");while (!priorityQueue.isEmpty()) {System.out.print(priorityQueue.poll() + " ");}}
}

输出:

PriorityQueue 中的元素:
1 2 3 4 5 6 

因为队列中的元素是通过小顶堆方式来确定优先级的,而小顶堆是一个完全二叉树,这就导致的队列输出为排序后的结果。等我们学到了数据结构时再详细说一下哈。

BlockingQueue

BlockingQueue (阻塞队列)是一个接口,继承自 Queue。BlockingQueue阻塞的原因是其支持当队列没有元素时一直阻塞,直到有元素;还支持如果队列已满,一直等到队列可以放入新元素时再放入。
应用场景:
生产者-消费者模型中,生产者线程会向队列中添加数据,而消费者线程会从队列中取出数据进行处理。
在这里插入图片描述

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

在这里插入图片描述

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

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

相关文章

Linux shell 命令中nohup 、、重定向的使用

一、nohup 和 & 使用方法 1.1、 nohup &#xff08;不挂断&#xff09; nohup 是 no hung up 的缩写&#xff0c;意思是不挂断 。 使用 Xshell 等Linux 客户端工具&#xff0c;远程执行 Linux 脚本时&#xff0c;有时候会由于网络问题&#xff0c;导致客户端失去连接&…

使用CompletableFuture在主线程捕获子线程异常

场景&#xff1a;我们使用线程池的时候&#xff0c;假如说某个线程出现了异常此时我们需要将异常捕获打印出相应的异常日志 这个时候就可以用到CompletableFuture的exceptionally方法&#xff0c;其作用是返回一个新的CompletableFuture&#xff0c;如果原CompletableFuture以…

电路设计(20)——数字电子钟的multism仿真

1.设计要求 使用数字芯片&#xff0c;设计一个电子钟&#xff0c;用数码管显示&#xff0c;可以显示星期&#xff0c;时、分、秒&#xff0c;可以有按键校准时间。有整点报警功能。 2.设计电路 设计好的multism电路图如下所示 3.芯片介绍 时基脉冲使用555芯片产生。在仿真里面…

eNSP学习——RSTP基础配置

目录 知识储备 实验内容: 实验目的: 实验步骤: 实验拓扑 实验编址 MAC地址表 实验步骤 一、基本配置 二、配置RSTP基本功能 三、配置边缘端口 四、查看备份端口状态 RSTP协议是对STP的升级,它重新划定端口的角色及状态,使用更快速的握手协商机制,降低了收敛…

UE5中的DataTable说明

创建DataTable 在编辑器中创建 在文件夹空白处右击&#xff0c;选择Miscellaneous/DataTable&#xff0c;如图&#xff1a; 使用代码创建 // 创建DataTable实例 UDataTable* MyDataTable NewObject(); // 创建一个行结构体 UStruct* RowStruct UStruct::CreateEmpty(); // 添…

[Flink01] 了解Flink

Flink入门系列文章主要是为了给想学习Flink的你建立一个大体上的框架&#xff0c;助力快速上手Flink。学习Flink最有效的方式是先入门了解框架和概念&#xff0c;然后边写代码边实践&#xff0c;然后再把官网看一遍。 Flink入门分为四篇&#xff0c;第一篇是《了解Flink》&…

【HarmonyOS】鸿蒙开发之Button组件——第3.4章

按钮类型 Capsule&#xff08;默认值&#xff09;&#xff1a;胶囊类型 Button("默认样式").height(40)//高度.width(90)//宽度.backgroundColor(#aabbcc)//背景颜色运行结果: Normal&#xff1a;矩形按钮&#xff0c;无圆角 Button({type:ButtonType.Normal}){Te…

kali无线渗透之蓝牙原理与探测与侦听

“传统蓝牙”规范在2.4GHz的ISM波段上定义了79个信道&#xff0c;每个信道有1MHz的带宽。设备在这些信道中以每秒1600次的频率进行跳转&#xff0c;换句话说&#xff0c;就是每微秒625次跳转。这项信道跳转技术被称为“跳频扩频”(Frequency HoppingSpread Spectrum&#xff0c…

数据结构-邻接矩阵的创建与遍历

上篇文章已经介绍了邻接矩阵的具体作用与如果利用邻接矩阵寻找相邻顶点&#xff0c;这次介绍重点为邻接矩阵的创建与两种遍历方式 邻接矩阵的创建 其结构体需要能记录顶点、顶点数、边数及邻接矩阵&#xff0c;即 #define max 100 typedef struct {int vex[max];//顶点(假设…

FPGA转行ISP的探索之二:技术路线和概念

ISP领域的概念 1 相机方面的概念 1&#xff09;DENOISE&#xff0c;图像去噪 图像噪声按噪声与信号的关系可分为加性噪声和乘性噪声&#xff1b;按照产生原因可分为外部噪声和内部噪声&#xff1b;按照统计特性可分为平稳噪声和非平稳噪声&#xff1b;平稳噪声基于统计后的概…

【C++搜索】BFS:走迷宫

题目描述 一个迷宫由R行C列格子组成&#xff0c;有的格子里有障碍物&#xff0c;不能走&#xff1b;有的格子是空地&#xff0c;可以走。 给定一个迷宫&#xff0c;求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走&#xff0c;不能斜着…

wsl内置Ubuntu使用 Dinky 与 Flink 集成

Dinky 与 Flink 集成 说明 本文档介绍 Dinky 与 Flink 集成的使用方法, 如果您是 Dinky 的新用户, 请先阅读 本文档, 以便更好的搭建 Dinky 环境 如果您已经熟悉 Dinky 并已经部署了 Dinky, 请跳过本文档的前置要求部分, 直接阅读 Dinky 与 Flink 集成部分 注意: 本文档基…

MinGW编译OpenCV4.5(64位/32位通用,附编译完成包下载)

MinGW编译OpenCV4.5(64位/32位通用,附编译完成包下载) MinGW编译OpenCV4.5

MySQL高级特性篇(3)-全文检索的实现与优化

MySQL数据库全文检索是指对数据库中的文本字段进行高效地搜索和匹配。在MySQL数据库中&#xff0c;可以使用全文检索来实现快速的文本搜索功能&#xff0c;并且可以通过一些优化手段提高全文检索的性能。 一、MySQL全文检索的基本概念 全文检索是一种将关键字搜索与自然语言处…

JAVA面试框架篇

1. Spring refresh 流程 要求 掌握 refresh 的 12 个步骤 Spring refresh 概述 refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#x…

单主模式和多主模式切换

1 组复制模式切换注意点 组复制有两种运行模式&#xff0c;一种是单主模式&#xff0c;一种是多主模式。这个模式是在整个组中设置的&#xff0c;由 group_replication_single_primary_mode 这个系统变量指定&#xff0c;而且在所有成员上必须保持一致。ON 表示单主模式&#…

禁止电子邮箱地址登录WordPress后台的插件No Login by Email Address

WordPress 4.5及之后的版本增加了使用注册用户的电子邮件地址代替用户名登录的功能&#xff0c;但是大多数个人站长的管理员邮箱地址都是固定&#xff0c;而且到其他站点进行评论留言也是同一个邮箱地址&#xff0c;很容易给一些别有用心的可乘之机&#xff0c;所以禁止WordPre…

(AtCoder Beginner Contest 341)(A - D)

比赛地址 : Tasks - Toyota Programming Contest 2024#2&#xff08;AtCoder Beginner Contest 341&#xff09; A . Print 341 模拟就好了 &#xff0c; 先放一个 1 , 然后放 n 个 01 ; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout…

【Effective Objective - C 2.0】——读书笔记(五)

文章目录 二十九、理解引用计数三十、以ARC简化引用计数三十一、在dealloc方法中只释放引用并解除监听三十二、编写异常安全代码时留意内存管理问题三十三、以弱引用避免保留环三十四、以”自动释放池块“降低内存峰值三十五、用"僵尸对象"调试内存管理问题三十六、不…

C++知识点总结(15):选择排序、插入排序

文章目录 一、选择排序1. 概念2. 伪代码3. 程序4. 例题第k大的数 二、元素插入1. 伪代码2. 程序 三、插入排序1. 概念2. 伪代码3. 程序4. 例题洛谷 P1152 四、分析 一、选择排序 1. 概念 下标12345最小值原始43521/第一次135241第二次125342第三次123543第四次123454完成1234…