JAVA数据篇-队列Queue使用

文章目录

  • 前言
  • 一、队列使用:
  • 二、队列元素的存入:
  • 三、队列元素的取出:
  • 三、队列数据实现类:
      • 非并发安全的队列:
      • 并发安全的队列:
  • 总结


前言

在 Java 中,队列(Queue)是一种用于存储和管理元素的线性数据结构,遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被取出。Java 中提供了多种队列的实现类,常用的包括 LinkedList、ArrayDeque 和 PriorityBlockingQueue 等。。


一、队列使用:

以下是 Java 中队列的基本操作示例:

// 创建队列对象:
Queue<Integer> queue = new LinkedList<>(); // 使用 LinkedList 实现队列
Queue<Integer> queue = new ArrayDeque<>(); // 使用 ArrayDeque 实现队列
Queue<Integer> queue = new PriorityBlockingQueue<>(); // 使用 PriorityBlockingQueue 实现优先级队列
//入队操作(添加元素到队列尾部):
queue.offer(1); // 添加元素到队列尾部
queue.add(2);
queue.offer(3);
//出队操作(从队列头部取出元素):
int element = queue.poll(); // 移除并返回队列头部元素
int element = queue.remove(); // 移除并返回队列头部元素,如果队列为空则抛出异常
int element = queue.peek(); // 返回队列头部元素但不移除,如果队列为空则返回 null
//判断队列是否为空:
boolean isEmpty = queue.isEmpty(); // 判断队列是否为空
//查看队列元素个数:
int size = queue.size(); // 查看队列中元素个数

队列的使用可以帮助解决很多实际问题,例如任务调度、消息队列、缓冲等。开发人员在编写应用程序时,可以根据具体场景选择合适的队列实现类,并运用队列的操作来实现所需的功能。

二、队列元素的存入:

在 Java 中,添加元素到队列中的方法主要有 add()offer()put(),它们都用于将元素添加到队列中,但在处理队列已满情况时有一些区别。

  1. add() 方法:

    • 语法:boolean add(E e)
    • 功能:将指定元素添加到队列的尾部
    • 特点:如果队列已满,直接调用 add() 方法会抛出 IllegalStateException 异常
  2. offer() 方法:

    • 语法:boolean offer(E e)
    • 功能:将指定元素添加到队列的尾部
    • 特点:如果队列已满,offer() 方法会返回 false,不会抛出异常
  3. put() 方法:

    • 语法:void put(E e) throws InterruptedException
    • 功能:将指定元素添加到队列的尾部
    • 特点:如果队列已满,put() 方法会阻塞当前线程,直到队列有足够的空间添加元素或者线程被中断,抛出 InterruptedException

总结:

  • add() 方法在队列已满时会直接抛出异常,不适合用于处理队列满的情况。
  • offer() 方法在队列已满时会返回 false,可以通过判断返回值来处理队列满的情况。
  • put() 方法在队列已满时会阻塞当前线程,适合用于处理队列满时的等待和阻塞情况,可以保证数据的插入成功。

开发人员根据具体的业务需求和处理逻辑,可以根据需要选择合适的方法来向队列中添加元素。如果需要避免出现队列满的情况导致异常,可以使用offer()方法并根据返回值来进行处理。如果需要确保数据一定会被插入,可以使用 put() 方法来实现阻塞等待。

三、队列元素的取出:

在 Java 中,取出队列元素的方法主要有 poll()remove()peek()take(),它们用于从队列中获取并移除元素或者查看队列头部的元素,它们之间的区别如下:

  1. poll() 方法:

    • 语法:E poll()
    • 功能:获取并移除队列头部的元素,如果队列为空则返回 null
    • 特点:当队列为空时,返回 null,不会抛出异常
  2. remove() 方法:

    • 语法:E remove()
    • 功能:获取并移除队列头部的元素,如果队列为空则抛出 NoSuchElementException 异常
    • 特点:当队列为空时,会抛出异常
  3. peek() 方法:

    • 语法:E peek()
    • 功能:查看但不移除队列头部的元素,如果队列为空则返回 null
    • 特点:仅仅只是查看队首元素,并不对队首元素进行删除操作
  4. take() 方法:

    • 语法:E take() throws InterruptedException
    • 功能:获取并移除队列头部的元素,如果队列为空会阻塞当前线程,直到有元素可以被取出或者线程被中断
    • 特点:当队列为空时,会使当前线程进入阻塞状态,直到有元素可以被取出或者线程被中断

总结:

  • poll() 方法在队列为空时返回 null,无需处理异常。
  • remove() 方法在队列为空时会抛出异常,需要对异常进行处理。
  • peek() 方法用于查看队列头部元素但不移除,不会对队列产生影响。
  • take() 方法在队列为空时会阻塞当前线程,适用于需要等待队列有元素可取时。

根据具体业务需求和处理逻辑,开发人员可以选择合适的方法来从队列中取出元素。如果需要防止异常,可以使用poll()方法并根据返回值来进行处理。如果需要确保有元素可取后再进行操作,可以使用take()方法。

三、队列数据实现类:

在 Java 中,队列的实现类主要可以分为两类:非并发安全的队列和并发安全的队列。下面列举一些常见的队列实现类,并标注它们的并发安全性:

非并发安全的队列:

  1. LinkedList: 非并发安全,适合用作普通队列但不适合在多线程环境下使用。
  2. ArrayDeque: 非并发安全,同样适合用作普通队列但不适合在多线程环境下使用。
  3. PriorityQueue: 非并发安全,不适合在多线程环境下使用。

并发安全的队列:

  1. ArrayBlockingQueue:具有固定容量的有界阻塞队列,是并发安全的。
  2. LinkedBlockingQueue:基于链表的阻塞队列,是并发安全的。
  3. PriorityBlockingQueue:基于优先级堆的无界阻塞队列,是并发安全的。
  4. ConcurrentLinkedQueue:基于非阻塞算法的无界队列,是并发安全的。
  5. BlockingQueueLinkedTransferQueueLinkedBlockingDequejava.util.concurrent 包中的队列都是并发安全的。

注意:虽然上述并发安全的队列实现类可以在多线程环境下安全使用,但在具体使用时仍需根据业务场景进行综合考虑和选择。

在多线程环境下,推荐使用 java.util.concurrent 包中提供的并发安全队列实现类,这些类已经考虑了线程安全性和高效性。如果在非多线程环境下使用队列,可以选择非并发安全的实现类,如 LinkedListArrayDeque


总结

Java 中的队列 (Queue) 是一种先进先出 (FIFO) 的数据结构,用于存储元素并按照它们被添加的顺序进行访问。常用的队列实现类有 LinkedList、ArrayDeque、PriorityQueue 等,同时在 java.util.concurrent 包中还提供了多种并发安全的队列实现类。

以下是关于 Java 队列的总结:

  • 队列是一种线性数据结构,支持在队尾插入元素,对头删除元素。
  • Queue 接口继承自 Collection 接口,定义了一系列操作队列的方法,如入队、出队、查看头元素等。
  • 常用的队列实现类有 LinkedList、ArrayDeque、PriorityQueue 等,它们分别基于链表、数组和优先级堆实现。
  • LinkedList 和 ArrayDeque 是非并发安全的队列实现类,适合单线程操作。
  • PriorityQueue 是一个基于优先级堆的队列,元素可以按照自然顺序或自定义比较器进行排序。
  • java.util.concurrent 包中提供了一系列并发安全的队列实现类,如 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、ConcurrentLinkedQueue 等,适合在多线程环境下使用。
  • 阻塞队列是一种特殊的队列,支持在队列满或空时阻塞等待元素的插入或获取,可通过 put()、take()、offer()、poll() 方法实现。
  • 队列在多线程编程中经常被用来实现生产者消费者模式,通过队列来平衡生产者和消费者之间的速度差异。
  • 总的来说,队列是一种常用的数据结构,在 Java 中有多种实现类及并发安全的实现类可供选择,开发人员可以根据具体需求选择适合的队列类来实现功能。队列在处理任务排队、数据传输等场景下具有重要作用,是编程中常用的数据结构之一。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个整数数组 nums&#xff0c;其中 nums[i] 表示第 i 天的预约时间长度。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是数组…

STM32时钟简介

1、复位&#xff1a;使时钟恢复原始状态 就是将寄存器状态恢复到复位值 STM32E10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。 复位分类&#xff1a; 1.1系统复位 除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统 复位将复位…

SQL-CRUD-2数据库实验

目录 第一关任务描述 相关知识 插入完整内容的行 插入选定内容的行 编程要求 测试说明 第一关代码 第二关任务描述 相关知识 删除表中的指定行 删除表中的所有行 编程要求 测试说明 第二关代码 第三关任务描述 相关知识 更新表中的指定行 编程要求 测试说明…

【学习】信创产品软件测试企业建设参考清单

“信创&#xff0c;即信息技术应用创新产业&#xff0c;涉及IT基础设施、基础软件、应用软件、信息安全等方面&#xff0c;产品覆盖面广、专业性强。作为目前的一项国家战略&#xff0c;也是当今形势下国家经济发展的新动能&#xff0c;信创产业发展已经成为促进经济数字化转型…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…

【QT+QGIS跨平台编译】043:【libprotobuf-lite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libprotobuf-lite介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libprotobuf-lite介绍 libprotobuf-lite 是 Protocol Buffers 的 C++ 轻量级运行时库,专门设计用于在资源受限的环境下使用。与标准的 libprotobuf(Protocol Buffers…

深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;深入浅出的揭秘游标尺模式与迭代…

力扣 718. 最长重复子数组

题目来源&#xff1a;https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义。dp[i][j] &#xff1a;以下标i - …

速通数据结构第三站 单链表

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 感谢佬们支持&#xff01; 目录 系列文章目录 前言一、单链表 1 结构体 …

踏上机器学习之路:探索数据科学的奥秘与魅力

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境 unbentu&#xff0c;docker https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz 二、解析 PHP Filter 当中有一种 convert.iconv 的 Filter &#xff0c;可以用来将数据从字符集 A 转换为字符集 B &#xff0c;其中这两个字符集可以…

记录pycharm配置Anaconda环境时没有反应的问题

记录pycharm配置Anaconda环境时没有反应的问题 背景 下载最新pycharm后在设置中配置add interpreter Anaconda环境时&#xff0c;x选中conda.ba文件点击Load Enviroments后&#xff0c;没有反应&#xff0c;就闪了一下&#xff0c;也有添加成功 探索路程 试过了重启&#x…

NineData与StarRocks商业化运营公司镜舟科技完成产品兼容认证

近日&#xff0c;镜舟科技与NineData完成产品兼容测试。在经过联合测试后&#xff0c;镜舟科技旗下产品与NineData云原生智能数据管理平台完全兼容&#xff0c;整体运行高效稳定。 镜舟科技致力于帮助中国企业构建卓越的数据分析系统&#xff0c;打造独具竞争力的“数据护城河”…

量化交易入门(二十五)什么是RSI,原理和炒股实操

前面我们了解了KDJ&#xff0c;MACD&#xff0c;MTM三个技术指标&#xff0c;也进行了回测&#xff0c;结果有好有坏&#xff0c;今天我们来学习第四个指标RSI。RSI指标全称是相对强弱指标(Relative Strength Index),是通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市…

leetcode热题100.柱状图中最大的矩形

Problem: 84. 柱状图中最大的矩形 文章目录 题目思路复杂度Code 题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;hei…

RAM IP核

1.原理 数据使能信号充当掩码的作用。1表示1字节就是8个位有效。

答题小程序功能细节揭秘:如何提升用户体验和满足用户需求?

答题小程序功能细节体现 随着移动互联网的快速发展&#xff0c;答题小程序成为了用户获取知识、娱乐休闲的重要平台。一款优秀的答题小程序不仅应该具备简洁易用的界面设计&#xff0c;更应该在功能细节上做到极致&#xff0c;以提升用户体验和满足用户需求。本文将从题库随机…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

day56 动态规划part13

300. 最长递增子序列 中等 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,…

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中&#xff0c;我们提出了FedCoin&#xff0c;一个基于区块链的点对点支付系统&#xff0c;专为联邦学习设计&#xff0c;以实现基于Shapley值的实际利润分配。在FedCoin系统中&#xff0c;区块链共识实体负责计算SV&#xff0c;并且新的区块是基于“Shapley证明”&a…
最新文章