Java 中常用队列用法详解
Java 中常用队列用法详解
在Java编程中,队列是一种非常重要的数据结构,广泛应用于任务调度、消息传递以及多线程通信等场景。以下将详细介绍几种常用的Java队列及其使用方法。
1. Queue
接口概述
Queue
是Java集合框架中的一个接口,它定义了先进先出(FIFO)的数据结构行为。常见的实现类包括:
LinkedList
:实现了双端队列(Deque),支持在两端进行插入和移除操作。ArrayDeque
:基于数组的高效队列实现,也支持双端操作。PriorityQueue
:根据元素优先级排序的队列。
2. 常用队列实现类及用法
(1) LinkedList 作为 Queue 使用
虽然 LinkedList
主要用于列表结构,但它也实现了 Queue
接口,可以用来当作队列使用。
-
主要方法:
add(E element)
:将指定元素插入队尾。remove()
:移除并返回队头元素。如果队列为空,则抛出NoSuchElementException
。peek()
:查看队头元素,不进行移除操作。如果队列为空,返回null
。
-
示例代码:
Queue<String> queue = new LinkedList<>(); queue.add("A"); queue.add("B");System.out.println(queue.peek()); // 输出 AString element = queue.remove(); System.out.println(element); // 输出 A
(2) ArrayDeque
ArrayDeque
是一个基于数组实现的双端队列,支持在两端快速插入和移除元素。它实现了 Queue
和 Deque
接口。
-
主要方法:
addFirst(E element)
:将指定元素添加到队列头部。addLast(E element)
:将指定元素添加到队列尾部。removeFirst()
:移除并返回队列头部的元素。removeLast()
:移除并返回队列尾部的元素。
-
示例代码:
Queue<String> deque = new ArrayDeque<>();deque.add("A"); deque.add("B");System.out.println(deque.peek()); // 输出 Adeque.addFirst("C"); // 添加到头部 System.out.println(deque.peek()); // 输出 CString element = deque.remove(); // 移除队头元素 C System.out.println(element); // 输出 C
(3) PriorityQueue
PriorityQueue
是一个优先级队列,其中的元素根据其自然顺序或指定的比较器进行排序。每次取出时总是返回优先级最高的元素。
-
主要方法:
add(E element)
:将指定元素插入队列中。remove()
:移除并返回队头元素(即优先级最高的元素)。peek()
:查看队头元素,不进行移除操作。
-
示例代码:
Queue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.add(3); priorityQueue.add(1); priorityQueue.add(2);System.out.println(priorityQueue.peek()); // 输出 1int element = priorityQueue.remove(); System.out.println(element); // 输出 1
(4) BlockingQueue
BlockingQueue
是Java并发包中的接口,主要用于多线程环境下的生产者-消费者模式。常见的实现类包括:
LinkedBlockingQueue
:基于链表的有界或无界队列。ArrayBlockingQueue
:基于数组的有界队列。PriorityBlockingQueue
:支持优先级的有界队列。
示例代码(使用 LinkedBlockingQueue):
import java.util.concurrent.LinkedBlockingQueue;public class BlockingQueueExample {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(2);// 生产者线程Thread producerThread = new Thread(() -> {try {System.out.println("生产者开始生产...");blockingQueue.put("Item 1");blockingQueue.put("Item 2");blockingQueue.put("Item 3"); // 队列已满,阻塞直到有空间} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("生产者线程被中断...");}});// 消费者线程Thread consumerThread = new Thread(() -> {try {System.out.println("消费者开始消费...");while (true) {String item = blockingQueue.take();System.out.println("消费了: " + item);}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("消费者线程被中断...");}});producerThread.start();consumerThread.start();}
}
3. 注意事项
-
容量控制:
- 对于有界队列(如
ArrayBlockingQueue
),需要合理设置初始容量,避免频繁的扩容操作。
- 对于有界队列(如
-
线程安全:
BlockingQueue
的实现类都是线程安全的,适用于多线程环境下的任务分发和消息传递。
-
性能考虑:
- 不同的队列实现类在插入、删除等操作上的性能表现可能有所不同。例如,
ArrayDeque
在两端的操作上比LinkedList
更高效。
- 不同的队列实现类在插入、删除等操作上的性能表现可能有所不同。例如,
4. 总结
Java中提供了多种多样的队列实现,每种都有其适用场景:
- 如果需要简单的先进先出行为,可以选择
LinkedList
或ArrayDeque
。 - 如果需要根据元素优先级进行处理,可以使用
PriorityQueue
。 - 在多线程环境下,推荐使用
BlockingQueue
及其子类,以简化任务分发和同步的复杂性。
通过合理选择和使用这些队列结构,可以在实际开发中显著提升代码的效率和可维护性。
相关文章:
Java 中常用队列用法详解
Java 中常用队列用法详解 在Java编程中,队列是一种非常重要的数据结构,广泛应用于任务调度、消息传递以及多线程通信等场景。以下将详细介绍几种常用的Java队列及其使用方法。 1. Queue 接口概述 Queue 是Java集合框架中的一个接口,它定义…...
IoT FEM射频前端模组芯片(2.4G PA)三伍微电子GSR2401 兼容替代RFX2401
型号:GSR2401应用:适用于蓝牙(BT)、ZigBee及物联网(IoT)设备 功能:集成了功率放大器(PA)、开关(Switch)和低噪声放大器(LNAÿ…...
android如何在生产环境中做到详实的日志收集而不影响性能?
在Android应用的生命周期中,日志收集贯穿于开发、测试到生产环境的每一个阶段。特别是在生产环境中,当应用部署到成千上万的用户设备上时,开发者无法直接访问用户的运行环境,也无法像在开发阶段那样通过调试工具实时查看代码执行情况。这时,日志就成为连接开发者与用户设备…...
深入解析 Linux 系统中的动静态库:从原理到实践
引言 在 Linux 开发中,动态库(.so)和静态库(.a)如同软件开发的“乐高积木”,它们将代码模块化,提高复用性并优化系统资源。当你在终端输入 ls 时,背后可能依赖了数十个动态库&#…...
Django视图(未分离)
ListView、DetailView、CreateView、UpdateView 和 DeleteView 是 Django 框架中基于类的通用视图(Class-Based Generic Views) 配置 URL 路由 在 urls.py 中为这些视图配置路由: from django.urls import path from .views import (PostLis…...
0基础 | 开发环境 |51单片机编译环境 Keil C251和C51,STM32的编译环境Keil 5 MDK-ARM
51单片机编译环境 Keil C51 简介:Keil C51是Keil Software公司(现已被ARM收购)专门为8051微控制器家族开发的编译器,它将标准C语言与8051单片机硬件特性相结合,让开发者能够用C语言高效地开发51单片机应用程序。特点 …...
Python内置函数---all()
Python内置函数 all() 用于判断可迭代对象中的所有元素是否都为真值(Truthy),是逻辑判断的重要工具。 1. 基本语法 all(iterable) 参数: iterable 必须为可迭代对象(如列表、元组、集合、字典的值等)。…...
Windows系统安装RustDesk Server的详细步骤和客户端设置
Windows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Node.js环境来运行,而PM2是一…...
路由过滤实验
实验拓扑以及要求 此实验总结 1.ip-prefix 拒绝192.168.4.1 32,这样写的话并不会匹配192.168.4.1 32,需要加上范围less-eq 32,也就是说,192.168.4.1 32只是规则的范围,匹配还是得写范围 2.router-policy适合用在边界路由器引入 filter-policy都可以用 配置IP 配置ospf,rip …...
数据结构学习笔记 :栈、队列与表达式转换详解
目录 栈(Stack) 1.1 顺序存储实现 1.2 链式存储实现队列(Queue) 2.1 顺序存储实现 2.2 链式存储实现中缀表达式转后缀表达式后缀表达式计算总结与应用场景 一、栈(Stack) 栈是一种**后进先出(…...
项目优化中ini配置文件解析器
一、项目背景 在停车管理项目中不同道闸口的终端配置可能不同,如靠近居民楼的道闸终端LED的语音播报音量和靠近马路的道闸门口不同;不同终端道闸锁闸时间也可能不同,诸如此类放在数据库中,不同的终端在启动时必须先连接到数据库才…...
【FPGA】【DE2-115】DDS信号发生器设计
目录 一、基本概述 1.1 DDS简介 1.2 DDS工作原理 1.2.1 核心组成部分 1.2.2 工作流程 1.2.3 输出频率计算 1.3 常见的RAM、ROM、FIFO等IP核的参数设置和调用过程 1.3.1 RAM IP核的参数设置和调用过程 1.3.2 ROM IP核的参数设置和调用过程 1.3.3 FIFO IP核的参数设置和…...
使用 OpenRewrite 简化 Java 和 SpringBoot 迁移
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 移民的挑战 随着 Spring Boot 2.x 等旧版本即将到期且不再获得支持,迁移到较新版本对于安全性、兼容性和性能改进至关重要。但…...
电脑怎么设置锁屏密码 分享详细设置教程
电脑不仅仅是工作的工具,更是存储着大量个人信息和重要数据的私人空间。设置电脑锁屏密码是保护这些信息,免受未经授权访问的基本安全措施之一。那么,电脑怎么锁屏密码呢?下面便为大家介绍在一些不同操作系统中怎么设置电脑锁屏密…...
【Netty篇】Handler Pipeline 详解
目录 一、 Handler & Pipeline——流水线上的“特种部队”与“生产线”1、 ChannelHandler —— 流水线上的“特种兵”👮♂️2、 ChannelPipeline —— 生产线上的“接力赛跑”🏃♀️🏃♂️ 二、 代码实例1、 服务端代码示例2、 客…...
Postman实现接口测试(附项目实战)
Postman实现接口测试(附项目实战) Postman实现接口测试 掌握如何安装Postman 掌握Postman的基本用法 掌握全局变量与环境变量 掌握Postman断言和关联 掌握如何读取外部文件实现参数化 掌握如何使用Newman生成HTML测试报告 1.Postman介绍和安装 Postman是…...
从零上手GUI Guider学习LVGL——Button
视频教程请关注我b站:同学_好好学习,这里只是做相应的笔记文稿 从零上手GUI Guider学习LVGL——Buttton 前言: 首先我们为什么要学习LVGL设计工具呢? 1 降低开发难度 2 提高开发效率 所以我们需要学习一款合适的设计工具 在b站很少…...
软件工程知识体系全面梳理
一、软件工程概述 1. 软件工程基本概念 定义:应用系统化、规范化、可量化的方法开发、运行和维护软件的学科 目标:提高软件质量、降低开发成本、控制开发周期 三要素:方法、工具、过程 2. 软件生命周期 可行性分析 → 需求分析 → 设计 …...
操作教程|通过DataEase制作MaxKB系统数据大屏
MaxKB(Max Knowledge Brain)是一款强大易用的企业级AI助手,支持RAG检索增强生成、工作流编排、MCP工具调用能力,目前正在被广泛应用于智能客服、企业内部知识库、学术研究与教育等场景。MaxKB可以帮助用户快速搭建面向不同应用场景…...
关于webpack的知识点
一、什么是webpack?它的核心概念是什么? webpack是现代JavaScript应用程序的打包工具 它的核心概念包括: 入口输出loaderplugin(插件)模式模块依赖图 二、webPack与Grunt\Grulp有什么区别? 首先Grunt/Gulp是任务运行器,用来实现流…...
Linux系统中的 sudo 权限会导致环境变量失效。
标题为什么 sudo 会破坏 配置的环境变量? 权限切换:sudo 以 root 用户 身份执行命令,root 用户的环境变量和当前用户(user)的环境变量是隔离的。 环境变量丢失:nvm 依赖的 PATH、等环境变量是通过用户 She…...
目标分割模型优化自身参数都是梯度下降算法吗?
在计算机视觉的深度学习任务中,诸如 CNN、FCN、U-Net、DeepLab 系列模型已成为图像分类与图像分割任务的核心架构。它们在网络结构和任务上有所差异,但是否共享同一种优化机制?是否都使用梯度下降?优化过程中又有什么本质区别&…...
前端请求传参与后端匹配的接收方式Content-Type类型
文章目录 一、Content-Type简介二、Content-Type类型三、常⽤类型3.1. application/json:JSON数据格式3.2. application/x-www-form-urlencoded:普通表单格式(键值对)3.3. multipart/form-data:多部分表单格式…...
解决:VSCode C++ conan 安装第三方库后 头文件报错
文章目录 1 头文件include路径查找报错参考 1 头文件include路径查找报错 找到conan_toolchain.cmake中 INCLUDE_PATH list(PREPEND CMAKE_INCLUDE_PATH "/Users/hanliqiang/.conan2/p/b/fmte8c4f7a755477/p/include")生成C编译配置 CtrlShiftP 中选择C Edit Confi…...
(leetcode算法题)309. 买卖股票的最佳时机含冷冻期
按照题目要求,研究对象是最后一天结束后获得的最大利润 那么就可以把问题拆分成 第 1 天结束后获得的最大利润, 第 2 天结束后获得的最大利润, 第 i 天结束后获得的最大利润, 由于规则中强调不能同时参与多笔交易,…...
win10和win11系统修复工具各类故障解决
点赞关注一下哈: 在使用电脑时可能会遇到一些问题,通过上网查找解决方法费时费力,而有了这个小工具可以很方便的解决问题。有几十种解决方案,值得下载保存哦。 1、使用方法: 解压文件,双击文件夹内的exe文件…...
微硕WSP6949 MOS管在补水仪中的应用与市场分析
微硕WSP6949 MOS管在补水仪中的应用与市场分析 一、引言 补水仪作为一种常见的家用电器,其核心部件之一是驱动电路,而MOS管作为驱动电路中的关键元件,其性能直接影响到补水仪的运行效率和稳定性。微硕半导体推出的WSP6949 MOS管,…...
【通过Zadig给鼠标适配器安装驱动后,鼠标动不了,无法恢复的解决办法】
【通过Zadig给鼠标适配器安装驱动后,鼠标动不了,无法恢复的解决办法 问题产生缘由感谢这位大佬提供的解决办法解决办法 问题产生缘由 通过Zadig给鼠标适配器安装USB GAMING MOUSE这个驱动后,鼠标动不了,无法恢复(重启电脑,卸载鼠标驱动再重装也不可以), 不过还好,我用的是笔记…...
基本表单的实现即登录注册页面的实现
1.登录页面(opType.value0) 2.注册页面(opType.value1) 3.注意 el-form-item中的prop对应的是rules里面的key值 <el-form-itemlabel"邮箱"prop"email"label-width"100px"> </el-form-i…...
JVM 什么是逃逸分析?它有哪些优化手段?
JVM 逃逸分析 (Escape Analysis) 是一种编译器优化技术,主要由即时编译器 (JIT Compiler) 在运行时进行,用于分析对象的作用域,判断对象是否会逃逸出方法或线程。 什么是逃逸? 在 JVM 的上下文中,“逃逸” 指的是对象…...
Spring AI与通义千问的完美结合:构建智能对话应用
Spring AI是Spring生态系统中的新成员,它为开发人员提供了一套简单而强大的工具,用于集成各种AI大模型。本文将介绍如何使用Spring AI与阿里云通义千问大模型进行集成,构建智能对话应用,帮助你快速掌握AI应用开发的核心技能。 引言 随着人工智能技术的快速发展,越来越多的…...
CST仿真天线流程
基础操作指导 如何建模、设置边界条件、端口激励等。 材料属性设置、网格划分优化。 仿真参数配置(频域/时域仿真)。 常见仿真案例 天线设计(如微带天线、波导天线)。 微波器件(滤波器、功分器、耦合器࿰…...
Vue 组件化开发
引言 在当今的 Web 开发领域,构建一个功能丰富且用户体验良好的博客是许多开发者的目标。Vue.js 作为一款轻量级且高效的 JavaScript 框架,其组件化开发的特性为我们提供了一种优雅的解决方案。通过将博客拆分成多个独立的组件,我们可以提高…...
java + spring boot + mybatis 通过时间段进行查询
前端传来的只有日期内容,如:2025-04-17 需要在日期内容的基础上补充时间部分,代码示例: /*** 日志查询(分页查询)* param recordLogQueryDTO 查询参数对象* return 日志列表*/Overridepublic PageBean<…...
基于pycatia的CATIA自动化干涉检测系统开发全解析
引言 在智能制造时代,三维数模的干涉检测效率直接影响产品开发周期。本文基于Python的pycatia库,深入解析CATIA自动化干涉检测系统的开发要点与工业实践,结合达索系统最新技术趋势,为工程师提供一套高可靠性的二次开发方案。 一、…...
v-model进阶+ref+nextTick
一、v-model进阶 复习 v-model v-model: 双向数据绑定指令 数据 <-> 视图: 数据和视图相互影响, 因此被称为双向数据绑定指令 1> 数据变了, 视图也会跟着变 (数据驱动视图) 2> 视图变了, 数据也会跟着变 1. v-model 原理 v-model只是一个语法糖, 比较好用, …...
vscode+keil嵌入式软件开发全流程
vscodekeil嵌入式软件开发全流程 1 安装MinGW-w64 (1) MinGW-w64 是一个用于Windows操作系统的开发工具集,其包含了C语言编译器 GCC(GNU Compiler Collection),官网地址:https://www.mingw-w6…...
GitHub 从入门到精通完全指南(2025版)
以下是GitHub 从入门到精通完全指南,整合优质教程及官方文档,涵盖基础操作、协作开发、高级功能及实战技巧,助你快速掌握 GitHub 全流程。 一、GitHub 入门篇 1. 注册与配置 注册 GitHub 账号 访问 GitHub 官网,点击“Sign Up”填写邮箱、用户名、密码完成注册。建议绑定双…...
总结【过往部分项目经历一(计算机图形学方向)】
总结【过往部分项目经历】 1.蜂窝填充算法2.孔洞识别算法3.扫掠轮廓计算4.二维排料算法5.最大内接圆算法 1.蜂窝填充算法 介绍: 主要从二维六角网格基本算法出发,基于自定义数据结构和拓扑关系,从二维到三维进行拓展,六角网格->六棱柱-&g…...
Flask(补充内容)配置SSL 证书 实现 HTTPS 服务
没有加密的http服务,就像在裸泳,钻到水里便将你看个精光。数据在互联网上传输时,如果未经加密,随时可能被抓包软件抓住,里面的cookie、用户名、密码什么的,它会看得一清二楚,所以,只…...
js逆向分享
某验三代 这玩意大家应该都人手一份了,也没啥好分享的了,需要注意的是,一共五个请求,分别是: "https://apiv6.geetest.com/gettype.php “https://apiv6.geetest.com/get.php” “https://api.geevisit.com/a…...
【cocos creator 3.x】速通3d模型导入, 模型创建,阴影,材质使用,模型贴图绑定
1、右键创建平面,立方体 2、点击场景根节点,shadows勾选enabled3、点击灯光,shadow enabled勾选 4、点击模型,勾选接收阴影,投射阴影(按照需要勾选) 5、材质创建 6、选中节点,找…...
CentOS 中安装 vim
1. 使用 Yum 安装 Vim 如果您的系统可以正常访问互联网,并且已经配置好了正确的 Yum 源,可以直接运行以下命令安装 vim: sudo yum install vim -y 如果默认的 vim 包不可用,可以尝试安装增强版 vim-enhanced: sudo yu…...
安全可靠+操作简捷——安科瑞预付费电表的用户体验升级
安科瑞顾强 在现代化用电场景中,预付费模式凭借其高效性与便捷性,已成为商业、工业及住宅用电管理的优选方案。安科瑞电气推出的DDSY1352/DTSY1352系列预付费电能表,搭配智能管理平台,为用户提供从精准计量、智能控制到数据分析的…...
AI与物联网的深度融合:开启智能生活新时代
在当今数字化时代,人工智能(AI)和物联网(IoT)作为两大前沿技术,正在加速融合,为我们的生活和工作带来前所未有的变革。这种融合不仅提升了设备的智能化水平,还为各行各业带来了新的机…...
赛灵思 XCVU095-2FFVB2104E XilinxFPGA Virtex UltraScale
XCVU095-2FFVB2104I 是 Xilinx(现 AMD)Virtex UltraScale 系列中的高端 FPGA 器件,基于 20nm 工艺,提供卓越的逻辑密度和高速串行 I/O 能力,广泛应用于 400G 网络、ASIC 原型验证及大型数据中心互联 该器件集成 1 176…...
leetcode0212. 单词搜索 II - hard
1 题目:单词搜索 II 官方标定难度:难 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成ÿ…...
解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题
在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…...
67.评论日记
我的评论本身也就是一种回答 沈阳车展帖子灵异失踪,究竟是谁干的?_哔哩哔哩_bilibili 2025年4月17日17:32:10...
Vscode 插件开发
文章目录 1、使用vscode官方插件生成框架,下载脚手架2、使用脚手架初始化项目,这里我选择的是js3、生成的文件结构如下,重要的就是以下两个文件4、代码5、打包使用6、发布官网地址7、publisher ID undefined provided in the extension manif…...