java Queue 详解
Java Queue
详解
Queue
是 Java 集合框架中用于实现 队列 数据结构的接口,位于 java.util
包中。队列是一种 先进先出(FIFO) 的数据结构,元素按照插入的顺序依次出队。
1. Queue 的基本特性
-
FIFO(First-In-First-Out):
- 队列中的第一个元素是最先被处理的。
- 特殊实现(如
Deque
)可以支持双向队列操作。
-
队列操作:
- 插入元素:
add()
/offer()
。 - 访问元素(不移除):
element()
/peek()
。 - 移除元素:
remove()
/poll()
。
- 插入元素:
-
接口定义:
Queue
是一个接口,继承自java.util.Collection
。 -
实现类:
LinkedList
(常用)PriorityQueue
ArrayDeque
ConcurrentLinkedQueue
(线程安全)
2. Queue 的方法
Queue
接口提供了以下主要方法:
方法 | 描述 |
---|---|
add(E e) | 将指定元素插入队列,如果队列已满,则抛出异常。 |
offer(E e) | 将指定元素插入队列,如果队列已满,则返回 false 。 |
remove() | 移除并返回队列头部的元素,如果队列为空,则抛出异常。 |
poll() | 移除并返回队列头部的元素,如果队列为空,则返回 null 。 |
element() | 返回队列头部的元素(不移除),如果队列为空,则抛出异常。 |
peek() | 返回队列头部的元素(不移除),如果队列为空,则返回 null 。 |
方法对比
方法类型 | 抛出异常 | 返回特殊值 |
---|---|---|
插入 | add() | offer() |
移除 | remove() | poll() |
访问(不移除) | element() | peek() |
3. Queue 的实现类
3.1 LinkedList
LinkedList
是Queue
的常用实现之一,底层基于链表实现。- 它既可以用作队列(FIFO),也可以用作双向队列(
Deque
)。
示例:
import java.util.LinkedList;
import java.util.Queue;public class LinkedListQueue {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();// 添加元素queue.add("A");queue.add("B");queue.add("C");// 访问头部元素System.out.println("Head: " + queue.peek()); // 输出:A// 移除元素System.out.println("Removed: " + queue.poll()); // 输出:A// 遍历队列for (String item : queue) {System.out.println(item); // 输出:B, C}}
}
3.2 PriorityQueue
- 基于 堆(Heap) 实现的队列,元素按照自然顺序或自定义顺序排序。
- 特点:
- 不保证 FIFO 顺序,优先级高的元素先出队。
- 适合实现优先级任务调度。
示例:
import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {PriorityQueue<Integer> pq = new PriorityQueue<>();// 添加元素pq.add(5);pq.add(2);pq.add(8);pq.add(1);// 按优先级移除元素while (!pq.isEmpty()) {System.out.println(pq.poll()); // 输出:1, 2, 5, 8}}
}
注意:PriorityQueue
不支持 null
元素。
3.3 ArrayDeque
- 基于 动态数组 实现的双端队列(
Deque
)。 - 特点:
- 比
LinkedList
更高效(无额外的链表节点开销)。 - 可以用作栈(LIFO)或队列(FIFO)。
- 比
示例:
import java.util.ArrayDeque;
import java.util.Queue;public class ArrayDequeExample {public static void main(String[] args) {Queue<String> queue = new ArrayDeque<>();// 添加元素queue.offer("X");queue.offer("Y");queue.offer("Z");// 访问头部元素System.out.println("Head: " + queue.peek()); // 输出:X// 移除元素System.out.println("Removed: " + queue.poll()); // 输出:X}
}
3.4 ConcurrentLinkedQueue
- 是一个线程安全的非阻塞队列,基于 CAS(Compare-And-Swap) 实现。
- 适用场景:
- 适用于高并发场景下的无界队列。
示例:
import java.util.concurrent.ConcurrentLinkedQueue;public class ConcurrentQueueExample {public static void main(String[] args) {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();// 添加元素queue.offer("P");queue.offer("Q");queue.offer("R");// 访问头部元素System.out.println("Head: " + queue.peek()); // 输出:P// 移除元素System.out.println("Removed: " + queue.poll()); // 输出:P}
}
4. 特殊队列
4.1 阻塞队列(BlockingQueue)
- 提供阻塞操作的队列接口,位于
java.util.concurrent
包中。 - 主要实现类:
ArrayBlockingQueue
:基于数组的有界阻塞队列。LinkedBlockingQueue
:基于链表的阻塞队列。PriorityBlockingQueue
:支持优先级排序的阻塞队列。SynchronousQueue
:一个没有存储能力的队列,直接在生产者和消费者之间传递数据。
示例:
import java.util.concurrent.ArrayBlockingQueue;public class BlockingQueueExample {public static void main(String[] args) throws InterruptedException {ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);// 添加元素queue.put("1");queue.put("2");queue.put("3");// 移除元素System.out.println(queue.take()); // 输出:1}
}
特点:
- 当队列满时,插入操作会阻塞。
- 当队列空时,删除操作会阻塞。
4.2 双端队列(Deque)
- 是
Queue
的子接口,支持从两端插入和删除元素。 - 常见实现:
ArrayDeque
LinkedList
示例:
import java.util.Deque;
import java.util.LinkedList;public class DequeExample {public static void main(String[] args) {Deque<String> deque = new LinkedList<>();// 添加元素deque.addFirst("A");deque.addLast("B");// 访问头尾元素System.out.println("First: " + deque.getFirst()); // 输出:ASystem.out.println("Last: " + deque.getLast()); // 输出:B// 移除元素deque.removeFirst();System.out.println("After removing first: " + deque);}
}
5. Queue 的常见用例
5.1 任务调度
- 使用
PriorityQueue
或BlockingQueue
实现任务调度。
5.2 消息队列
- 使用
ConcurrentLinkedQueue
或BlockingQueue
实现线程间通信。
5.3 树/图的广度优先搜索(BFS)
- 使用
Queue
存储待访问的节点。
示例:
import java.util.LinkedList;
import java.util.Queue;public class BFSExample {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();// 初始化队列queue.offer(1);while (!queue.isEmpty()) {int node = queue.poll();System.out.println("Visited node: " + node);// 模拟添加邻居节点if (node < 3) {queue.offer(node + 1);}}}
}
输出:
Visited node: 1
Visited node: 2
Visited node: 3
6. 总结
常用实现类对比
实现类 | 特点 | 适用场景 |
---|---|---|
LinkedList | 基于链表,支持双端队列操作;性能适中。 | 一般队列操作或双向队列。 |
PriorityQueue | 元素按优先级排序,不保证 FIFO 顺序。 | 优先级任务调度。 |
ArrayDeque | 高效实现队列和栈;比 LinkedList 更节省内存。 | 双端队列或栈的实现。 |
ConcurrentLinkedQueue | 线程安全的无界队列,适用于高并发场景。 | 多线程环境下的队列操作。 |
BlockingQueue | 提供阻塞操作,用于线程间通信。 | 生产者-消费者模式。 |
选择 Queue
实现时,应根据具体需求(如是否需要优先级、线程安全等)选择合适的实现类。
相关文章:
java Queue 详解
Java Queue 详解 Queue 是 Java 集合框架中用于实现 队列 数据结构的接口,位于 java.util 包中。队列是一种 先进先出(FIFO) 的数据结构,元素按照插入的顺序依次出队。 1. Queue 的基本特性 FIFO(First-In-First-Out&…...
贪心算法 -- 递增子序列
目录 最长递增子序列 题解: 代码: 递增的三元子序列 题解: 代码: 简易版: 最长连续递增序列 题解: 代码: 最长递增子序列 300. 最长递增子序列 - 力扣(LeetCode…...
MySQL:表的增删查改
目录 一. Create 1.1 单行数据全列插入 1.2 多行数据全列插入 1.3 插入否则更新 1.3.1 要插入的值与原数据有冲突则更新 1.3.2 要插入的值与原数据没有冲突则正常插入 1.3.3 要插入的值与原数据有冲突但是连续更新了两次 1.4 替换 二. Retrieve 2.…...
Python操作neo4j库py2neo使用之创建和查询(二)
Python操作neo4j库py2neo使用之创建和查询(二) py2neo 创建操作 1、连接数据库 from py2neo import Graph graph Graph("bolt://100.100.20.55:7687", auth(user, pwd), nameneo4j)2、创建Node from py2neo import Node, Subgraph # 创建…...
【pytorch-04】:线性回归案例(手动构建)
文章目录 1 构建数据集2 构建假设函数3 损失函数4 优化方法5 训练函数6.总结 1 构建数据集 为什么构建数据加载器? 在进行训练的时候都是采用的不是全部的数据,而是采用一个batch_size的数据进行训练,每次向模型当中送入batch_size数据&#…...
外包干了3年,技术退步明显...
先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…...
React Native 全栈开发实战班 -原生功能集成之相机与图片
在移动应用中,相机功能 和 图片选择 是非常常见的需求,用户可以通过相机拍照或从相册中选择图片。React Native 提供了多种方式来实现相机和图片选择功能,包括使用第三方库(如 react-native-image-picker)和调用原生模…...
以太坊交易处理全流程:数据采集、价格查询与问题解决
一、背景 在开发交易记录处理系统时,涉及从以太坊链上获取交易记录、将其存储到数据库、根据交易时间查询历史价格,并计算交易的美元价值。在这一过程中,涉及多个技术环节及工具的综合使用,例如区块链 API 调用、数据库操作、时间戳处理和外部数据接口整合。 本文涉及的内…...
css数据不固定情况下,循环加不同背景颜色
<template><div><p v-for"(item, index) in items" :key"index" :class"getBackgroundClass(index)">{{ item }}</p></div> </template><script> export default {data() {return {items: [学不会1, …...
【Node.js】Node.js 和浏览器之间的差异
Node.js 是一个强大的运行时环境,它在现代 JavaScript 开发中扮演着重要角色。然而,许多开发者在使用 Node.js 时常常会感到困惑,尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异,帮助你全面理解两者的设计…...
算法【最长递增子序列问题与扩展】
本文讲解最长递增子序列以及最长不下降子序列的最优解,以及一些扩展题目。本文中讲述的是最优解,时间复杂度是O(n*logn),空间复杂度O(n),好实现、理解难度不大。这个问题也可以用线段树来求解,时间和空间复杂度和本节讲…...
【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击
基本信息 原文标题:ROBUSTKV: DEFENDING LARGE LANGUAGE MODELS AGAINST JAILBREAK ATTACKS VIA KV EVICTION 原文作者:Tanqiu Jiang, Zian Wang, Jiacheng Liang, Changjiang Li, Yuhui Wang, Ting Wang 作者单位:Stony Brook University…...
查询Mysql中被锁住的表以及如何解锁
当MySQL中的表被锁住时,可能会导致查询变慢或完全无法访问该表。处理这种情况的方法取决于锁的原因以及你想要达到的目标。以下是一些常见的步骤和技巧,可以帮助你解决被锁住的表的问题: 1. 识别锁的情况 首先,你需要确定哪些表…...
【Mac】未能完成该操作 Unable to locate a Java Runtime
重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令,原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…...
RT_Thread内核源码分析(三)——线程
目录 1. 线程结构 2. 线程创建 2.1 静态线程创建 2.2 动态线程创建 2.3 源码分析 2.4 线程内存结构 3. 线程状态 3.1 线程状态分类 3.2 就绪状态和运行态 3.3 阻塞/挂起状态 3.3.1 阻塞工况 3.4 关闭状态 3.4.1 线程关闭接口 3.4.2 静态线程关闭 3.4.3 动态线程关…...
淘宝 NPM 镜像源
npm i vant/weapp -S --production npm config set registry https://registry.npmmirror.com 要在淘宝 NPM 镜像站下载项目或依赖,你可以按照以下步骤操作: 1. 设置淘宝 NPM 镜像源 首先,你需要设置淘宝 NPM 镜像源以加速下载。可以通过…...
机器学习—学习曲线
学习曲线是帮助理解学习算法如何工作的一种方法,作为它所拥有的经验的函数。 绘制一个符合二阶模型的学习曲线,多项式或二次函数,画出交叉验证错误Jcv,以及Jtrain训练错误,所以在这个曲线中,横轴将是Mtrai…...
Rust 智能指针
Rust 智能指针 引言 Rust 是一种系统编程语言,以其内存安全性、并发性和高性能而闻名。Rust 的核心特性之一是其独特的所有权模型,它确保了内存安全,同时避免了垃圾收集。在 Rust 中,智能指针是一种特殊的数据结构,它们不仅存储数据,还负责管理数据的生命周期。智能指针…...
云原生周刊:Kubernetes v1.32 要来了
开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎,以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言,能够灵活适配不同开发流程,帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…...
Easyexcel(3-文件导出)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出) 响应头设置 通过设置文件导出的响应头,可以自定义文件导出的名字信息等 //编码格式为UTF-8 response.setC…...
php:使用socket函数创建WebSocket服务
一、前言 闲来无事,最近捣鼓了下websocket,但是不希望安装第三方类库,所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…...
ubuntu20.04中编译安装gcc 9.2.0
ubuntu20.04中编译安装gcc 9.2.0,步骤如下: #install compile dependence libraries 1:$ sudo apt install libgmp-dev libisl-dev libmpc-dev libmpfr-dev # install gcc 9.2.0 # download source code 2:$ wget http://ftp.gnu.org/gn…...
ssm158企业人事管理系统的设计与实现+jsp(论文+源码)_kaic
设计题目:企业人事管理系统的设计与实现 摘 要 进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据…...
OceanBase数据库产品与工具介绍
OceanBase:蚂蚁集团自主研发的分布式关系数据库 1、什么是 OceanBase? OceanBase 是由蚂蚁集团完全自主研发的企业级分布式关系数据库,始创于 2010 年。它具有以下核心特点: 数据强一致性:在分布式架构下确保数据强…...
PakePlus将任何网页免费打包为mac/windows跨平台软件程序教程,只需要一个Github token就可以了
PakePlus是一个开源免费的软件,支持 Mac、Windows 和 Linux,很快也将支持 Android 和 iOS。无需在本地安装复杂的依赖环境,只需要一个Github Token就可以了。查看 README 以获取热门包和自定义开发信息。欢迎在讨论区分享你的建议。开源地址&…...
Element UI 组件库详解【Vue】
文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站,element.eleme.cn El…...
Android kotlin之配置kapt编译器插件
配置项目目录下的gradle/libs.versions.toml文件,添加kapt配置项: 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…...
基于 MUSA 的大语言模型推理和服务框架vLLM
1. 引言 vLLM是一个高性能且内存高效的大语言模型推理和服务框架,也是当前业界使用范围最广的大模型推理框架,截至目前github star数28.4k。该框架性能优秀,而且部署容易,使用CUDA/ROCm提供GPU加速能力。但vLLM目前不支持使用摩…...
k8s 集群安装
安装rockylinux https://www.jianshu.com/p/a5fe20318b8e https://www.cnblogs.com/haoee/p/18290506 配置VirtualBox双网卡 https://www.cnblogs.com/ShineLeBlog/p/17580311.html https://zhuanlan.zhihu.com/p/341328334 https://blog.csdn.net/qq_36544785/article/deta…...
Linux-服务器辨别实体机OR虚拟机
快速命令 ① lscpu(查看CPU信息) lscpu Hypervisor vendor: KVM (超管理器厂商:KVM。虚拟机:KVM / VMware) Virtualization: VT-x(虚拟化:VT-x。实体机:VT-x / AMD-V) ② systemd-detect-virt(检测当前系…...
堤防安全监测系统方案
一、背景情况 堤防是开发利用水资源和防治水灾害的重要工程措施之一,对防洪、供水、生态、发电、航运等至关重要。我国现有堤防9.8万多座,其中大中型堤防4700多座、小型堤防9.4万座,80%以上修建于上世纪50至70年代。由于堤防管护力量薄弱&am…...
Leetcode 求根节点到叶节点数字之和
使用深度优先搜索 DFS 来做 我提供的代码使用的是 深度优先搜索(DFS,Depth-First Search) 算法。以下是具体的算法思想和实现步骤的解释: 算法思想 树的路径代表数字: 树中每条从根节点到叶子节点的路径可以看作一个整…...
Git分布式版本控制系统
1. 版本控制系统 版本控制系统主要分为两类:集中式、分布式。 集中式:SVM(工作流程:所有的文件都保存在中央服务器上,每个电脑上只保存了一个副本,当需要修改时,先下载中央服务器上的最新版本文件…...
数据库审计工具--Yearning 3.1.9普民的使用指南
1 页面登录 登录地址:18000 (不要勾选LDAP) 2 修改用户密码 3 DML/DDL工单申请及审批 工单申请 根据需要选择【DML/DDL/查询】中的一种进行工单申请 填写工单信息提交SQL检测报错修改sql语句重新进行SQL检测,如检测失败可以进行SQL美化后…...
VMware Workstation 17.6.1
概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1: 本月11号官宣:针对所有人免费提供,包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后,双击默认安装即可: 一路单击下一步按钮: 等待…...
unity 中 RectTransform 的常用几个属性
RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置(编译器显示的pos) …...
23种设计模式-模板方法(Template Method)设计模式
文章目录 一.什么是模板方法模式?二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图: 模板方法设计模式类图 一.什么是模板方法模…...
网络安全之国际主流网络安全架构模型
目前,国际主流的网络安全架构模型主要有: ● 信息技术咨询公司Gartner的ASA(Adaptive Security Architecture自适应安全架构) ● 美国政府资助的非营利研究机构MITRE的ATT&CK(Adversarial Tactics Techniques &…...
SpringCloud多机部署,负载均衡-LoadBalance
一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例,获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…...
前端开发调试之 PC 端调试学习笔记
一、引言 在前端开发过程中,调试是至关重要的一个环节。它能帮助我们快速定位代码中的问题,无论是页面布局错乱、交互效果异常还是性能不佳等情况,通过有效的调试手段都可以找到根源并进行修复。而在 PC 端进行调试有着其特定的方法和技巧&am…...
视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调用无效问题
流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来,随着技术的不断进步和应用场景的不断拓展,流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时,流媒体播放器也会成为数字娱乐产业的重要组成部分,…...
使用 cnpm 安装 Electron,才是正确快速的方法
当然,下面是总结的几种安装 Electron 的方法,包括使用 npm 和 cnpm,以及一些常见的问题解决技巧。 ### 1. 使用 npm 安装 Electron #### 步骤 1: 初始化项目 在你的项目目录中初始化一个新的 Node.js 项目: bash npm init -y …...
pytest日志总结
pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…...
【Ubuntu24.04】使用服务器
目录 0 背景1 将文件传送到服务器1.1 主机上的虚拟机1.2 另一台独立的计算机(包括上面的虚拟机)1.3 远程文件传输1.3.1 scp2 操作服务器2.1 ssh2.2 Termius2.2.1 下载2.2.2 安装2.2.3 使用2.2.4 小结3 总结0 背景 你是一个开发者,有自己的测试环境:一个Linux服务器(假设是…...
Spark 之 Aggregate
Aggregate 参考链接: https://github.com/PZXWHU/SparkSQL-Kernel-Profiling 完整的聚合查询的关键字包括 group by、 cube、 grouping sets 和 rollup 4 种 。 分组语句 group by 后面可以是一个或多个分组表达式( groupingExpressions )…...
ubuntu没有了有线网络如何修复
今天打开ubuntu之后发现有线网络连接没有了,如下图,此时是修复好之后的,“有线”部分存在,出现问题时是不存在的 此时只需要修改NetworkManager.conf配置文件,将managedfalse更改为managedtrue,保存退出就可以了 sudo…...
2411rust,异步函数
原文 Rust异步工作组很高兴地宣布,在实现在特征中使用异步 fn的目标方面取得了重大进度.将在下周发布稳定的Rust1.75版,会包括特征中支持impl Trait注解和async fn. 稳定化 自从RFC#1522在Rust1.26中稳定下来以来,Rust就允许用户按函数的返回类型(一般叫"RPIT")编…...
解决IDEA报包不存在,但实际存在的问题
前言 最近在把一个亿老项目交割给同事,同事在导入项目运行时遇到IDEA报包不存在,但实际存在的问题,最终通过以下方式解决 现象 在IDEA里启动运行项目,报某个类有问题,引入的包不存在。 点击这个引入的包,可…...
解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题
解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题Chapter2 windows主机和ubuntu互传文件的4种方法 博文链接:Chapter3 安装好VMware tools后无法复制粘贴文本、拖拽文件的解决办法 Chapter1 解…...
SpringBoot与MongoDB深度整合及应用案例
SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域,NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB,作为一款领先的NoSQL数据库,以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…...