Java [数据结构] Deque与Queue

news2024/11/24 5:08:08

🤺深入理解 Java 中的 Deque 和 Queue🤺

在现代软件开发中,数据结构是构建高效、可维护代码的基础。

Java 作为一门广泛应用的编程语言,其丰富的集合框架(Collections Framework)为开发者提供了多种强大的数据结构,其中 Queue(队列)和 Deque(双端队列)尤为常见。本文将深入探讨 Java 中的 QueueDeque,帮助你更好地理解和使用它们来解决实际问题。

队列和双端队列在日常编程中的应用场景非常广泛。无论是任务调度、缓存系统,还是处理广度优先搜索(BFS)算法,队列都能大显身手。而双端队列则进一步扩展了队列的功能,使得数据可以从两端插入和删除,增加了数据处理的灵活性。

本文将从概念、接口方法和具体实现三个方面,详细介绍 QueueDeque 的基本原理及其在 Java 中的具体应用。通过对比这两种数据结构的异同,希望读者能够更好地选择和使用它们,提高程序的性能和可读性。

接下来,让我们首先了解 Queue 的基本概念及其在 Java 中的实现。

Queue(队列)使用Deque

概念

  • 队列是一种先进先出(FIFO,First-In-First-Out)的数据结构。
  • 常用于排队系统,如任务调度、缓冲区等。

主要接口方法

  • boolean add(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败(例如容量限制)抛出异常。
  • boolean offer(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败返回 false。
  • E remove(): 移除并返回队列头部的元素,如果队列为空抛出异常。
  • E poll(): 移除并返回队列头部的元素,如果队列为空返回 null。
  • E element(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。
  • E peek(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。

实现类

  • LinkedList
  • PriorityQueue
  • ArrayDeque
  • ConcurrentLinkedQueue
  • LinkedBlockingQueue
  • ArrayBlockingQueue

import java.util.Deque;
import java.util.ArrayDeque;

public class QueueUsingDequeDemo {

    public static void main(String[] args) {
        // 创建一个ArrayDeque实例,当作单向队列使用
        Deque<String> queue = new ArrayDeque<>();

        // 入队操作:在队列尾部添加元素
        queue.offer("苹果");
        queue.offer("香蕉");
        queue.offer("樱桃");

        System.out.println("当前队列: " + queue);

        // 出队操作:从队列头部移除并获取元素
        String firstFruit = queue.poll();
        if (firstFruit != null) {
            System.out.println("出队元素: " + firstFruit);
            System.out.println("出队后队列: " + queue);
        } else {
            System.out.println("队列为空,无法出队。");
        }

        // 检查队列是否为空
        boolean isEmpty = queue.isEmpty();
        System.out.println("队列是否为空? " + isEmpty);
    }
}

Deque(双端队列)

概念

  • 双端队列是一种可以在两端进行插入和删除操作的数据结构。
  • 支持既可以作为队列使用(FIFO),也可以作为栈使用(LIFO,Last-In-First-Out)。

主要接口方法

  • 插入操作:
    • void addFirst(E e): 在队列的头部添加元素,如果失败抛出异常。
    • void addLast(E e): 在队列的尾部添加元素,如果失败抛出异常。
    • boolean offerFirst(E e): 在队列的头部添加元素,如果成功返回 true,如果失败返回 false。
    • boolean offerLast(E e): 在队列的尾部添加元素,如果成功返回 true,如果失败返回 false。
  • 移除操作:
    • E removeFirst(): 移除并返回队列头部的元素,如果队列为空抛出异常。
    • E removeLast(): 移除并返回队列尾部的元素,如果队列为空抛出异常。
    • E pollFirst(): 移除并返回队列头部的元素,如果队列为空返回 null。
    • E pollLast(): 移除并返回队列尾部的元素,如果队列为空返回 null。
  • 检查操作:
    • E getFirst(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。
    • E getLast(): 返回队列尾部的元素,但不移除它,如果队列为空抛出异常。
    • E peekFirst(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。
    • E peekLast(): 返回队列尾部的元素,但不移除它,如果队列为空返回 null。

实现类都可以

  • LinkedList
  • ArrayDeque
  • LinkedBlockingDeque
import java.util.Deque;
import java.util.ArrayDeque;

public class DequeDemo {

    public static void main(String[] args) {
        // 创建一个ArrayDeque实例
        Deque<String> deque = new ArrayDeque<>();

        deque.addFirst("你好");

        // 在队列末尾添加元素
        deque.addLast("苹果");
        deque.addLast("香蕉");
        deque.addLast("樱桃");

        System.out.println("初始双端队列: " + deque);

        // 在队列开头添加元素
        deque.addFirst("火龙果");

        System.out.println("在队首添加后: " + deque);

        // 从队列开头移除并获取元素
        String firstFruit = deque.removeFirst();
        String s = deque.pollFirst();

        System.out.println("从队首1移除: " + firstFruit);
        System.out.println("从队首2移除: " + s);

        System.out.println("移除后双端队列: " + deque);

        // 从队列末尾移除并获取元素
        String lastFruit = deque.removeLast();
        System.out.println("从队尾移除: " + lastFruit);
        System.out.println("再次移除后双端队列: " + deque);

        // 检查双端队列是否为空
        boolean isDequeEmpty = deque.isEmpty();
        System.out.println("大小" + deque.size());
        System.out.println("双端队列是否为空? " + isDequeEmpty);
    }
}

总结

  • Queue 适用于需要先进先出的情况,常见实现类如 LinkedListPriorityQueue
  • Deque 提供了更多的灵活性,可以作为队列(FIFO)和栈(LIFO)使用,常见实现类如 LinkedListArrayDeque

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

Zabbix 排坑版 Centos7

systemctl stop firewalld;systemctl disable firewalld;setenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configzabbix源地址,可以自己选版本&#xff0c;安装都大差不差 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5…

【车载开发系列】S32 Design Studio工具安装步骤

【车载开发系列】S32 Design Studio工具安装步骤 S32 Design Studio工具安装步骤 【车载开发系列】S32 Design Studio工具安装步骤※关键字提炼※一. 准备工作二. 下载安装包三. 获取License许可四. 开始预安装五. 开始正式安装六. 启动软件七. 安装插件八. 卸载插件九. 确认安…

【操作系统】进程管理——进程控制和进程通信(个人笔记)

学习日期&#xff1a;2024.6.30 内容摘要&#xff1a;进程控制的概念&#xff0c;进程控制相关的“原语”&#xff0c;进程通信 进程控制 原语 进程控制用“原语”实现。原语是一种特殊的程序&#xff0c;它的执行具有原子性&#xff0c;也就是说&#xff0c;这段程序的执行…

vs code python开发笔记

目录 选择python 解析器 安装插件 不全&#xff1a; 调试启动目录问题&#xff1a; 2.选择python解释器 选择python 解析器 ctrl shift P select interpreter 安装插件 不全&#xff1a; remote ssh python debuger 左下角&#xff0c;点击左右左右箭头&#xff0c;远程…

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研发的一套通过java来操控数据库的工具&#xff0c;对应不同的数据库系统有不同的JDBC&#xff0c;而他们统称【驱动】&#xff0c;这就是上一篇我们提到创建Mybatis项目时要引入的依赖、以及连接数据库四要素里的第一要素。 JDBC有自己一套原始…

Redis 7.x 系列【8】数据类型之哈希(Hash)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 HSET2.2 HGET2.3 HDEL2.4 HEXISTS2.5 HGETALL2.6 HKEYS2.7 HLE…

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…

探索MySQL核心技术:理解索引和主键的关系

在数据密集型应用中&#xff0c;数据库的性能往往是决定一个应用成败的重要因素之一。其中&#xff0c;MySQL作为一种开源关系型数据库管理系统&#xff0c;以其卓越的性能和丰富的功能被广泛应用。而在MySQL数据库优化的众多技巧中&#xff0c;索引和主键扮演着极其重要的角色…

5、Python之rich:GUI之外,终端呈现也能玩出花

引言 在Python系列文章的上一篇中&#xff0c;我们从print的定义出发&#xff0c;进一步探索了print()函数更多的用法&#xff0c;尤其是一些哪怕是Python老手也可能忽略的用法。没有阅读的或者需要回顾print()及输出格式化的扩展用法&#xff0c;可以查看上一篇文章。 虽然pr…

2024/6/30周报

文章目录 摘要ABSTRACT文献阅读题目问题本文贡献方法LSTMTCN模型总体架构 实验实验结果 深度学习TCN-LSTM代码运行结果 总结 摘要 本周阅读了一篇关于TCN和LSTM进行光伏功率预测的文章&#xff0c;本文提出了一种利用LSTM-TCN预测光伏功率的新模型。它由长短期记忆和时间卷积网…

可编程定时计数器8253/8254 - 8253控制字

8253控制字 概述 图7-45中左下角的是控制字寄存器&#xff0c;其操作端口是0x43,它是8位大小的寄存器 控制字寄存器也称为模式控制器&#xff0c;在控制字寄存器中保存的内容称为控制字&#xff0c;控制字用来设置所指定的计数器(通道)的工作方式、读写格式及数制&#xff0c…

emptyDir + initContainer实现ConfigMap的动态更新(K8s相关)

1. 絮絮叨叨 K8s部署服务时&#xff0c;一般都需要使用ConfigMap定义一些配置文件例如&#xff0c;部署分布式SQL引擎Presto&#xff0c;会在ConfigMap中定义coordinator、worker所需的配置文件以node.properties为例&#xff0c;node.environment和node.data-dir的值将由Helm…

48 - 按日期分组销售产品(高频 SQL 50 题基础版)

48 - 按日期分组销售产品 -- group_concat 分组拼接selectsell_date,count(distinct product) num_sold,group_concat(distinct product order by product separator ,) products fromActivities group bysell_date;

监控电脑的软件有哪些?精选8大监控电脑的软件

根据当前市场反馈和功能评价&#xff0c;以下是八款备受推崇的电脑监控软件推荐&#xff0c;适合不同企业和组织的监控与管理需求&#xff1a; 1.安企神监控软件 特点&#xff1a;全面的局域网监控工具&#xff0c;擅长网络设备监控、网络性能管理和故障诊断。提供员工电脑屏幕…

C++操作系列(二):VSCode安装和配置C++开发环境

1. VSCode下载 进入VSCode的官网网页&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 下载相应的版本&#xff1a; 2. 安装VSCode 安装到指定位置&#xff1a; 一路下一步&#xff0c;直至安装完成&#xff1a; 3. 安装C插件 3.1. 安装C/C 点击扩展图标&…

语音唤醒入门(基于ESP-skainet)

主要参考资料&#xff1a; ESP-SR 用户指南: https://docs.espressif.com/projects/esp-sr/zh_CN/latest/esp32s3/index.html 目录 ESP提供的模型直接初始化和使用模型AFE声学前端算法 使用模型 自定义模型 ESP提供的模型 乐鑫提供了经过训练的 WakeNet 和 MultiNet 模型&…

《高考择校择专业:权衡与抉择的智慧》

分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 2024 年高考的大幕已然落下&#xff0c;然而对于众多考生而言&#xff0c;新的挑战才刚刚开始。在分数既定的情况下&#xff0c;是优先选择心仪的专业&#xff0c;还是更看重知名度高的学校&#xff1f;这无疑是一个令…

Go线程实现模型-核心元素的容器

核心元素的容器 图例 作用 3个全局容器存在的主要目的&#xff0c;都是为了罗列某个核心元素的全部 与G相关的调度器 与G相关的那4个非全局容器&#xff1a;调度器的可运行G队列、调度器的自由G队列、本地P的可运行G队列&#xff0c;以及本地P的自由G列表 全局G列表 任何…

LLM 大模型入门笔记-Tokenizer

下图展示了完整的 tokenization 流程&#xff0c;接下来会对每个步骤做进一步的介绍。 tokenizer_pipeline 1. Normalization normalize 其实就是根据不同的需要对文本数据做一下清洗工作&#xff0c;以英文文本为例可以包括删除不必要的空白、小写和/或删除重音符号。 代码…

《概率论与数理统计》期末复习笔记_下

目录 第4章 随机变量的数字特征 4.1 数学期望 4.2 方差 4.3 常见分布的期望与方差 4.4 协方差与相关系教 第5章 大数定律和中心极限定理 5.1 大数定律 5.2 中心极限定理 第6章 样本与抽样分布 6.1 数理统汁的基本概念 6.2 抽样分布 6.2.1 卡方分布 6.2.2 t分布 6.…