Java 集合 - Queue 接口

news2024/11/28 0:33:51

文章目录

    • 1.Queue 接口
    • 2.LinkedList
    • 3.ArrayDeque
    • 4.PriorityQueue
    • 5.总结

队列是一种特殊的线性数据结构,在数据的尾部插入元素,在数据的头部删除元素。通常以 FIFO(先进先出)的方式存储和访问数据。Java 中提供了 Queue 接口来实现队列,常用的实现类有 LinkedListArrayDeque 以及 PriorityQueue

1.Queue 接口

Queue 提供的是除了基本的 Collection 操作外的其他插入、抽取和检查方法。每个方法都存在两种形式:一种是在失败时抛出一个异常,一种是返回一个特殊值,如 nullfalse 队列的实现通常不允许插入 null 元素,但某些实现(如 ArrayLIst)并不禁止插入 null。即使在允许传入 null 的实现中,也不应该将 null 放入到其中,因为 null 通常用作表示队列不包含元素的特殊值。

下面是对应的 API:

方法抛出异常操作返回特殊值操作
插入add(e)offer(e)
移除remove()poll()
检查element()peek()

插入操作对应源码:

public interface Queue<E> extends Collection<E> {
    /**
     * 如果可以在不违反容量限制的情况下立即将指定的元素插入到此队列中,成功时返回true,
     * 如果当前没有可用空间,则抛出IllegalStateException
     *
     * @param e 需要插入的元素
     * @return 如果插入成功,则返回true,否则返回false
     * @throws IllegalStateException    如果当前没有空间
     * @throws ClassCastException       如果指定元素的类不允许它添加到此队列
     * @throws NullPointerException     如果指定元素为null,且此队列不允许null元素
     * @throws IllegalArgumentException 如果指定元素的某些属性不允许它添加到此队列
     */
    boolean add(E e);

    /**
     * 如果可以在不违反容量限制的情况下立即将指定的元素插入到此队列中,成功时返回true,否则返回false。
     *
     * @param e 需要插入的元素
     * @return 如果插入成功,则返回true,否则返回false
     * @throws ClassCastException       如果指定元素的类不允许它添加到此队列
     * @throws NullPointerException     如果指定元素为null,且此队列不允许null元素
     * @throws IllegalArgumentException 如果指定元素的某些属性不允许它添加到此队列
     */
    boolean offer(E e);
}

移除操作对应源码:

public interface Queue<E> extends Collection<E> {
    /**
     * 检索并删除此队列的头部。此方法与poll()方法的不同之处在于,如果此队列为空,则抛出异常。
     *
     * @return 此队列的头部
     * @throws NoSuchElementException 如果此队列为空
     */
    E remove();

    /**
     * 检索并删除此队列的头部。此方法与remove()方法的不同之处在于,如果此队列为空,则返回null
     *
     * @return 此队列的头部,如果此队列为空,则返回null
     */
    E poll();
}

检查操作对应源码:

public interface Queue<E> extends Collection<E> {
    /**
     * 检测但不删除此队列的头部。此方法与peek()方法的不同之处在于,如果此队列为空,则抛出异常。
     *
     * @return 此队列的头部
     * @throws NoSuchElementException 如果此队列为空
     */
    E element();

    /**
     * 检测但不删除此队列的头部。此方法与element()方法的不同之处在于,如果此队列为空,则返回null
     *
     * @return 此队列的头部,如果此队列为空,则返回null
     */
    E peek();
}

2.LinkedList

LinkedList 实现了 Queue 接口,并提供了协作式的多线程访问机制。LinkedList 可以作为栈、队列、双向队列的实现,提供了大量的方法来满足各种使用场景。

对应类图下:

Queue<String> queue = new LinkedList<>();

可以使用 LinkedList 类的 add() 方法或 offer() 方法往队列中添加元素,使用 remove() 方法或 poll() 方法来从队列中删除元素,使用 element() 方法或 peek() 方法来查看队列头部的元素。

// 添加元素
queue.add("one");
queue.add("two");
queue.add("three");

// 查看队首元素
System.out.println(queue.element()); // 输出:one
// 移除队首元素
System.out.println(queue.remove()); // 输出:one
// 查看队首元素
System.out.println(queue.peek()); // 输出:two

由于 LinkedList 还可以作为双向队列使用,所以除了提供和 Queue 接口中相同的方法外,LinkedList 还提供了一些双向队列特有的方法,如添加、获取第一个元素和最后一个元素:

// 创建双端队列
LinkedList<String> deque = new LinkedList<>();

// 在队首插入元素
deque.addFirst("one");
// 在队尾插入元素
deque.addLast("two");
// 在队尾插入元素
deque.addLast("three");

// 查看队首元素
System.out.println(deque.getFirst()); // 输出:one
// 查看队尾元素
System.out.println(deque.getLast()); // 输出:three
// 移除队首元素
System.out.println(deque.removeFirst()); // 输出:one
// 移除队尾元素
System.out.println(deque.removeLast()); // 输出:three

3.ArrayDeque

ArrayDeque 是另一种 Queue 接口的实现,内部使用循环数组进行实现。ArrayDeque 是线程不安全的,如果需要在多线程中并发访问队列,需要使用 Collections.synchronizedDeque() 方法将其转化为线程安全的。

对应类图下:

Queue<String> queue = new ArrayDeque<>();

// 添加元素
queue.offer("one");
queue.offer("two");
queue.offer("three");

// 查看队首元素
System.out.println(queue.element()); // 输出:one
// 移除队首元素
System.out.println(queue.remove()); // 输出:one
// 查看队首元素
System.out.println(queue.peek()); // 输出:two

LinkedList 一样,ArrayDeque 也可以作为栈和双向队列使用。

public static void main(String[] args) {
    // 用作栈(后进先出)
    ArrayDeque<String> stack = new ArrayDeque<>();

    // 添加元素(压栈)
    stack.push("one");
    stack.push("two");
    stack.push("three");

    // 查看栈顶元素
    System.out.println(stack.peek()); // 输出:three
    // 移除栈顶元素
    System.out.println(stack.pop()); // 输出:three

    // 用作双向队列(先进先出)
    ArrayDeque<String> queue = new ArrayDeque<>();

    // 添加元素
    queue.addFirst("one");
    queue.addLast("two");
    queue.addLast("three");

    // 查看队首元素
    System.out.println(queue.getFirst()); // 输出:one
    // 查看队尾元素
    System.out.println(queue.getLast()); // 输出:three
}

4.PriorityQueue

PriorityQueue 是一种基于优先级的队列,队列头部元素始终是队列中优先级最高的元素。Java 的 PriorityQueue 是通过二叉小顶堆实现的。在 PriorityQueue 中添加元素后,队列会自动维护这些元素的优先级,优先级最高的元素会被放置在队列头部。

对应类图下:

public static void main(String[] args) {
    Queue<Integer> queue = new PriorityQueue<>();

    // 添加元素
    queue.offer(5);
    queue.offer(2);
    queue.offer(9);

    // 查看队首元素
    System.out.println(queue.element()); // 输出:2
    // 移除队首元素
    System.out.println(queue.remove()); // 输出:2
    // 查看队首元素
    System.out.println(queue.peek()); // 输出:5
}

PriorityQueue 也可以自定义元素的比较器,在构造 PriorityQueue 对象的时候传入相应的比较器对象:

public static void main(String[] args) {
    // 创建基于字符串长度比较的优先队列
    PriorityQueue<String> queue = new PriorityQueue<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // 按照字符串长度比较
            return o1.length() - o2.length();
        }
    });

    // 添加元素
    queue.offer("Java");
    queue.offer("Python");
    queue.offer("C");

    // 查看队首元素
    System.out.println(queue.element()); // 输出:C
    // 移除队首元素
    System.out.println(queue.remove()); // 输出:C
    // 查看队首元素
    System.out.println(queue.peek()); // 输出:Java
}

5.总结

下面我们将对上面介绍的三个类进行简要的比较和总结:

特性 / 类型LinkedListArrayDequePriorityQueue
底层数据结构双向链表动态数组(环形)堆(Heap)
顺序FIFO(First-In-First-Out)FIFO(First-In-First-Out)按照自然排序或比较器排序
允许null元素
多线程安全
主要功能队列操作、栈操作、列表操作队列操作、栈操作优先级队列操作
  1. LinkedList:它是一个基于双向链表的实现,每个元素都包含前向和后向的链接,所以它的插入和删除操作通常都很快。它实现了 List 接口和 Deque 接口,因此它不仅可以用作队列,还可以用作栈或双端队列。LinkedList 允许插入 null 元素。
  2. ArrayDeque:它是一个基于动态数组实现的队列,它采用了环形数组的方式来优化空间使用。ArrayDequeLinkedList 在队列和栈操作上更高效,因为它没有链表节点的额外开销。但是,它不支持 null 元素。
  3. PriorityQueue:这是一种特殊类型的队列,它的元素按照自然排序或者比较器定义的顺序排序。也就是说,当你从 PriorityQueue 中检索元素时,总是获取优先级最高(或者最低,取决于比较器)的元素。这使得 PriorityQueue 成为实现优先级队列的理想选择。

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

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

相关文章

element-ui对话框dialog详解

效果展示 先给大家展示一下大致的样式 代码 <el-dialog draggable destroy-on-close v-model"dialogAddVisible" title"添加用户" width"35%" center><el-form :inline"true" :model"addFormInfo" status-icon …

Java中的String数据类型,String类(字符串)详解

目录 第一章、String概述1&#xff09;String是什么2&#xff09;String长什么样3&#xff09;String的构造方法(声明方式) 第二章、String类的详解1&#xff09;String底层是什么2&#xff09;字符串存储的内存原理/字符串常量池(String Constant Pool&#xff09;3&#xff0…

C语言-【指针二】-【指针运算/指针和数组】

好久不见吖&#xff0c;好啦&#xff0c;言归正传&#xff0c;这篇文章接着上篇文章的尾巴接着介绍指针相关知识哦&#xff01; 一.指针运算 &#xff08;1&#xff09;指针-整数 &#xff08;2&#xff09;指针-指针 &#xff08;3&#xff09;指针的关系运算 接下来&…

Apache Kafka - 高性能原因探究

文章目录 概述图解 概述 Kafka 的高性能主要依赖于以下几个关键因素: 分布式架构:Kafka 采用分布式集群架构,可以水平扩展到上万个节点,支持每秒处理百万级消息。持久化存储:Kafka 使用文件系统持久化存储消息,避免了数据库成为性能瓶颈,大大提高了吞吐量。顺序读写:Kafka 的…

计算机视觉:卷积核的运行过程

本文重点 我们前面从直观角度理解了卷积神经网络的卷积在特征提取的作用,本节课程我们从数学角度来看一下,卷积是如何计算的? 计算步骤 1. 将卷积核与输入图像的某一部分进行逐元素相乘。 2. 将相乘后的结果求和,得到卷积核在该部分的输出值。 3. 重复以上步骤,将卷积核…

达梦8逻辑备份导出导入dexp/dimp

逻辑导出&#xff08;dexp&#xff09;和逻辑导入&#xff08;dimp&#xff09;是 DM 数据库的两个命令行工具&#xff0c;分别用来实现对 DM 数据库的逻辑备份和逻辑还原。逻辑备份和逻辑还原都是在联机方式下完成&#xff0c;联机方式是指数据库服务器正常运行过程中进行的备…

数据结构作业4-图

图数据结构的小练习&#xff1a; 文章目录 数据结构作业4-图3 对图1所示的带权无向图。&#xff08;40分&#xff09;解&#xff1a; 4 对于图1所示的带权无向图。&#xff08;20分&#xff09;解&#xff1a; 5 已知带权有向图如下图所示&#xff0c;请利用Dijkstra算法从顶点…

基于操作系统的基础IO

1.c语言中的文件输入输出 在观看本章节的时候&#xff0c;大家可以去看看之前c语言的文件输入输出的有关博客。 好那么废话不多说之间进入本章正题: 我们都知道c程序默认会打开三个输入输出流&#xff1a; stdin&#xff1a;相当于键盘 stdout&#xff1a;相当于显示器 st…

【Linux】基本指令(四)

目录 &#x1f348;一.sort指令&#x1f348; &#x1f349;二.uniq指令&#x1f349; &#x1f34a;三.wc指令&#x1f34a; &#x1f34b;四.which指令&#x1f34b; &#x1f34e;五.whereis指令&#x1f34e; &#x1f34f;六.top指令&#x1f34f; &#x1f350;七…

【玩转 Cloud Studio】腾讯Cloud Studio 云端开发环境上手体验

目录 1、Cloud Studio简介 2、功能体验 3、Cloud Studio优点 4、总结 1、Cloud Studio简介 Cloud Studio&#xff08;云端 IDE&#xff09;是基于浏览器的集成式开发环境&#xff0c;为开发者提供了一个稳定快速的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;只…

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…

VS+Qt — Vistual Studio 2022+Qt6安装教程以及解决Qt Vistual Studio Tools下载慢和VS无法打开.ui进行设计的问题

目录 Vistual Studio 2022下载 Qt下载 Qt Vistual Studio Tools下载 方法1 方法2 方法3 方法4 Vistual Studio 2022配置Qt6 创建Qt项目 若VS无法打开.ui进行设计 Vistual Studio 2022下载 以前因为安装库的关系&#xff0c;已经下载过VS2022了&#xff0c;详细请看这…

C++ 学习 ::【基础篇:05】:C++ 函数重载认识及使用、简单介绍:C++ 支持函数重载的原因

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

CSS之基础扫盲

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 二、CSS基础语法 2.1 CSS引入方式 2.1.1 内部样式 2.1.2 外部样式 2.1.3 内联样式 2.2 CSS选择器 2.2.1 标签选择器 2.2.2 类选择器 2.2.3 id选择器 2.2.4 通配符选择器 2.2…

HNU-操作系统OS-实验Lab7

OS_Lab7_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 实验目的 理解操作系统的同步互斥的设计实现;理解底层支撑技术:禁用中断、定时器、等待队列;在ucore中理解信号量(semaphore)机制的具体实现;理解管程机制,在ucore内…

动力电池管理系统(BMS)

BMS技术 目录 BMS技术 一、BMS简介 二、BMS主要功能 1、参数检测 2、剩余电量&#xff08;SOC&#xff09;估计 3、充放电控制 4、热管理 5、均衡控制 6、故障诊断 7、信息监控 8、参数标定 9、CAN总线接口 三、BMS架构组成 1、BMS的拓扑架构 1、1集中式架构的B…

JavaEE进阶(5/27)Spring Boot

目录 1.认识Spring Boot 2.Spring Boot的优点 3.SpringBoot项目创建 4.resource文件夹 和test文件夹 5.使用一个Spring Boot项目 1.认识Spring Boot Spring Boot 中的Boot 是启动引导的意思 如果Spring相比于普通java开发是从走演变到了汽车&#xff0c;那么Spring boot 相比…

【博客历程】比起方法和技巧,我更想谈质量与坚持

【博客历程】比起方法和技巧&#xff0c;我更想谈质量与坚持 文章目录 【博客历程】比起方法和技巧&#xff0c;我更想谈质量与坚持[toc]我的第一篇博客为什么坚持写博客为什么选择CSDN何为质量未来 还没准备好&#xff0c;等我怎样怎样时再 还在犹豫什么时候开始&#xff0c;…

ssm+springboot+java高校图书馆图书借阅座位预约管理系统系统

陕理工图书馆管理系统包括多个功能模块&#xff1a;图书类别管理模块、图书管理模块、读者管理模块、借阅管理模块、预约管理、推荐管理。管理员登入后&#xff0c;维护图书借阅的信息。本文介绍了使用Java技术开发陕理工图书馆管理系统的设计与实现过程&#xff0c;首先对实现…

微信小程序 java+nodejs+vue美食定制个性化点餐推荐系统

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…