java Queue 详解

Java Queue 详解

Queue 是 Java 集合框架中用于实现 队列 数据结构的接口,位于 java.util 包中。队列是一种 先进先出(FIFO) 的数据结构,元素按照插入的顺序依次出队。


1. Queue 的基本特性

  1. FIFO(First-In-First-Out)

    • 队列中的第一个元素是最先被处理的。
    • 特殊实现(如 Deque)可以支持双向队列操作。
  2. 队列操作

    • 插入元素:add() / offer()
    • 访问元素(不移除):element() / peek()
    • 移除元素:remove() / poll()
  3. 接口定义
    Queue 是一个接口,继承自 java.util.Collection

  4. 实现类

    • 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

  • LinkedListQueue 的常用实现之一,底层基于链表实现。
  • 它既可以用作队列(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 任务调度

  • 使用 PriorityQueueBlockingQueue 实现任务调度。

5.2 消息队列

  • 使用 ConcurrentLinkedQueueBlockingQueue 实现线程间通信。

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 实现时,应根据具体需求(如是否需要优先级、线程安全等)选择合适的实现类。

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

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

相关文章

SpringCloud实用-OpenFeign 调用三方接口

文章目录 前言正文一、项目环境二、项目结构2.1 包的含义2.2 代理的场景 三、完整代码示例3.1 定义FeignClient3.2 定义拦截器3.3 配置类3.4 okhttp配置3.5 响应体3.5.1 天行基础响应3.5.2 热点新闻响应 3.6 代理类3.6.1 代理工厂3.6.2 代理客户端3.6.3 FeignClient的建造器 四…

《Object类》

目录 一、Object类 1.1 定义与地位 1.2 toString()方法 1.3 equals()方法 1.4 hashcode()方法 一、Object类 1.1 定义与地位 Object类是Java语言中的根类&#xff0c;所有的类&#xff08;除了Object类&#xff09;都直接或间接继承自Object。这就意味着在Java中&#xf…

单头蜗杆铣刀计算——记录一下

前面介绍过一期蜗杆的一些常用的加工方式《蜗杆的加工方式》&#xff0c;其中铣削加工也是非常常见的一种加工方式&#xff0c;下面来看看蜗杆铣刀的由来过程&#xff1a; 首先拿到蜗杆参数之后&#xff0c;需要将蜗杆准确的描述出来。渐开线蜗杆的参数与齿轮基本一致&#xf…

【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案

【Ubuntu 22.04FlaskGunicornNginx】部署目标检测模型API完整解决方案 文章目录 1. 搭建深度学习环境1.1 下载Anaconda1.2 打包环境1.3 创建虚拟环境1.4 报错 2. 安装flask3. 安装gunicorn4. 安装Nginx4.1 安装前置依赖4.2 安装nginx4.3 常用命令 5. NginxGunicornFlask5.1 ng…

大数据实战——MapReduce案例实践

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 大数据实战——MapReduce案例实践 一&#xff0e;过程分析&#xff08;截图&#xff09;1. 确定Hadoop处于启动状态2. 在/usr/local/filecotent…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则作用二&#xff1a;在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例&#xff1a; 代码优化&#xff1a; public static void main(String[] args) {// 大…

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复

目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件&#xff1a;apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…

SQL注入靶场演练

找闭合&#xff0c;用万能密码&#xff0c;发现过滤or&#xff0c;所以绕过admin’oORr‘1‘’1 发现登陆成功 尝试用order by查询列数&#xff0c;又发现by过滤&#xff0c;所以绕过admin’/**/oorrder/**/bBYy/**/3查出列数是3 用联合查询&#xff0c;发现过滤http://139.1…

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…

日常开发记录-正确的prop传参,reduce搭配promise的使用

日常开发记录-正确的prop传参&#xff0c;reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…

最大熵谱估计

估计思想&#xff1a;采用最大熵原则&#xff0c;外推自相关函数方法估计信号功率谱。它基于将已知的有限长度自相关序列以外的数据用外推的方法求得&#xff0c; 而不是把它们当作是零。 已知{ R(0),R(1),…R(p)},求得R(p1),R(p2),… 保证外推后自相关矩阵正定&#xff0c;自…

JavaWeb——Mybatis

6. Mybatis MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 6.1. Mybatis入门 6.1.1. 入门程序 6.1.2. JDBC 6.1.3. 数据库连接池 6.1.4. Lombok 6.2. Mybatis基础操作 6.2.1. 删除 6.2.1.1. 根据主键删除 6.2.1.2. 预编译SQL #{id}在编译过程中会替换成?…

零碎04 MybatisPlus自定义模版生成代码

目录 背景 动手开干 需要的依赖包&#xff0c;需要注意mybatis-plus-generator的3.5版本是没有兼容历史版本的。 定义一个CodeGenerator类&#xff0c;负责生成代码和配置属性 Entity模版 背景 MybatisPlus代码生成使用默认的velocity模版解决不了定制化的需求&#xff0…

tomcat 后台部署 war 包 getshell

1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场&#xff1a;192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下&#xff0c…

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…

如何给 Apache 新站点目录配置 SELinux ?

在 web 服务器管理领域&#xff0c;确保服务器环境的安全性至关重要。SELinux (Security-Enhanced Linux) 是保护 Linux 服务器最有效的工具之一&#xff0c;它是一种强制访问控制 (MAC mandatory access control) 安全机制。当使用最流行的 web 服务器 Apache 提供 web 内容时…

Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持

作者&#xff1a;来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布&#xff0c;通过集成 IBM watsonx™ Slate 嵌入模型&#xff0c;我们的开放推理 API 功能得以扩展&#xff0c;这…

【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;案例背景&#x1f4af;逻辑运算符的优先级与短路求值运算符优先级的概念短路求值的概念 &#x1f4af;分析案例代码的执行过程第一步&#xff1a;执行 && 运算第二步&#…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…