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.mzph.cn/news/778234.shtml

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

相关文章

Pyenv的安装和使用

Pyenv是一个简单的Python版本管理工具。通过Pyenv可以安装多个版本的Python&#xff0c;并且可以在多个版本之间轻松切换。所用操作系统&#xff1a;Ubuntu 22.04。 1. 安装Pyenv 1.1 说明 a) Pyenv支持UNIX/LINUX/MacOS系统&#xff0c;并未支持Windows操作系统&#xff0c;…

【开发篇】十二、GCeasy报告分析

文章目录 1、图一&#xff1a;正常情况2、图二&#xff1a;缓存对象过多3、图三&#xff1a;内存泄漏4、图四&#xff1a;频繁持续Full GC5、图五&#xff1a;元空间不足导致的Full GC 1、图一&#xff1a;正常情况 正常的堆内存如图&#xff1a; 锯齿状对象创建后内存占用上…

【PostgreSQL】- 1.2 PostgreSQL 配置单独的数据库存储

在 Debian 或其它 Linux 系统上&#xff0c;为数据库创建一个单独的挂载点&#xff08;如 /opt/pgdata&#xff09;并将一块大容量硬盘挂载到这个目录有几个优点&#xff1a;数据隔离、性能优化、备份和恢复、安全性。 因此接上篇 “【PostgreSQL】- 1.1 在 Debian 12 上安装 P…

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始&#xff0c;截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性&#xff0c;然后暴力遍历来去去重&#xff0c;从第一个下标开始截取aaab a aa aaa aaab…

【JS】数组详解

前言 数组是js中最常用到的数据集合&#xff0c;它是引用数据类型的一种&#xff08;其他二者为Object和Function&#xff09;&#xff0c;但其本质是Object。 一、数组的组成 数组由三部分组成&#xff0c;分别是索引、元素和length。 索引&#xff1a;用于标识元素&#xf…

ES学习日记(三)-------第三方插件选择

前言 在学习和使用Elasticsearch的过程中&#xff0c;必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求&#xff0c;未免太过麻烦&#xff0c;而且也不够人性化。 目前我了解的比较主流的插件就三个,head,cerebor和elasticHD 1.head 老牌插件,功能…

原生js实现循环滚动效果

原生js实现如下图循环滚动效果 核心代码 <div class"scroll"><div class"blist" id"scrollContainer"><div class"bitem"></div>......<div class"bitem"></div></div> </di…

Long long类型比较大小

long 与 Long long类型和Long类型是不一样&#xff0c;long类型属于基本的数据类型&#xff0c;而Long是long类型的包装类。 结论 long是基本数据类型&#xff0c;判断是否相等时使用 &#xff0c;即可判断值是否相等。&#xff08;基本数据类型没有equals()方法&#xff0…

局域网找不到共享电脑怎么办?

局域网找不到共享电脑是一种常见的问题&#xff0c;给我们的共享与合作带来一定的困扰。天联组网技术可以解决这个问题。本文将介绍天联组网的原理和优势&#xff0c;并探讨其在解决局域网找不到共享电脑问题中的应用。 天联组网的原理和优势 天联组网是一种基于加速服务器的远…

基于Pytorch的验证码识别模型应用

前言 在做OCR文字识别的时候&#xff0c;或多或少会接触一些验证码图片&#xff0c;这里收集了一些验证码图片&#xff0c;可以对验证码进行识别&#xff0c;可以识别4到6位&#xff0c;纯数字型、数字字母型和纯字母型的一些验证码&#xff0c;准确率还是相当高&#xff0c;需…

第14章动态规划

动态规划 确定递推状态&#xff1a; f(n)解释 确定递推公式 程序实现 优化&#xff1a; 去除冗余状态 状态重定义 优化转移过程 斜率优化 优化-递归记忆化 if arr[n] return arr[n]递归记忆化(正向求解-递归) 或 改变求解顺序&#xff08;逆向递归求解-循环&#xff09; &…

STM32 PWM通过RC低通滤波转双极性SPWM测试

STM32 PWM通过RC低通滤波转双极性SPWM测试 &#x1f4cd;参考内容《利用是stm32cubemx实现双极性spwm调制 基于stm32f407vet6》&#x1f4fa;相关视频链接&#xff1a;https://www.bilibili.com/video/BV16S4y147hB/?spm_id_from333.788 双极性SPWM调制讲解以及基于stm32的代码…

基于 RisingWave 和 ScyllaDB 构建事件驱动应用

概览 在构建事件驱动应用时&#xff0c;人们面临着两大挑战&#xff1a;1&#xff09;低延迟处理大量数据&#xff1b;2&#xff09;实现流数据的实时摄取和转换。 结合 RisingWave 的流处理功能和 ScyllaDB 的高性能 NoSQL 数据库&#xff0c;可为构建事件驱动应用和数据管道…

cts 运行时 有时候 aapt2 的问题

05-04 16:30:18 E/AaptParser: aapt2 dump badging stderr: W/ziparchive(1050736): Unable to open ‘badging’: No such file or directory badging: error: No such file or directory. 05-04 16:30:18 E/AaptParser: Failed to run aapt2 on /xxx/android-gts/tools/./…/…

阿里云发送短信配置

依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.2.1</version> </dependency> <dependency><groupId>org.apache.httpcomponents</groupId&g…

毛细管制冷系统的设计要点

1在制冷系统的高压侧&#xff0c;不要设置储液器&#xff0c;在保证冷凝器能够容纳全部制冷剂的前提下&#xff0c;尽量减少其有效容积。 因为在采用毛细管作为节流元件的制冷系统中&#xff0c;若设置储液器或冷凝器容积过大&#xff0c;则当压缩机停机后&#xff0c;制冷剂液…

使用html实现图片相册展示设计

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图片&#xff08;相册&#xff09;展示设计</title><link rel"stylesheet" href"./style.css"> </head> <b…

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

JavaScript 字符串 API

JavaScript 字符串 API 指南 JavaScript 中的字符串&#xff08;String&#xff09;是一种基本数据类型&#xff0c;表示文本数据。通过字符串 API&#xff0c;我们可以对字符串进行各种操作和处理&#xff0c;如创建、访问、修改、查找等。本指南将介绍 JavaScript 中常用的字…

【Ubuntu】Ubuntu LTS 稳定版更新策略

1、确保下载环境 sudo apt update && sudo apt upgrade -y sudo apt autoremove 2、安装更新管理器 sudo apt install update-manager-core -y 3、设置只更新稳定版 sudo vim /etc/update-manager/release-upgrades 4、开始更新&#xff0c;耐心等待 sudo do-re…