Queue详解(Java)

news2024/11/28 23:11:36

Queue详解

Java 中的队列(Queue)是一种数据结构,它遵循先进先出(FIFO)的原则。队列可以用于在一个集合中保存一组元素,并支持在队列的尾部添加元素,以及在队列的头部移除元素。

Java 标准库提供了 java.util.Queue 接口来表示队列,它是一个包含多个方法的接口。下面是一些常用的方法:

  1. add(E element):将指定元素添加到队列的尾部。如果队列已满,则抛出异常。
  2. offer(E element):将指定元素添加到队列的尾部。如果队列已满,则返回 false。
  3. remove():从队列的头部删除并返回一个元素。如果队列为空,则抛出异常。
  4. poll():从队列的头部删除并返回一个元素。如果队列为空,则返回 null。
  5. element():获取队列的头部元素,但不删除它。如果队列为空,则抛出异常。
  6. peek():获取队列的头部元素,但不删除它。如果队列为空,则返回 null。

除了 java.util.Queue 接口之外,Java 还提供了一些具体的队列类,如 LinkedListArrayDeque。这些类都实现了 java.util.Queue 接口,并且提供了自己的特定行为和性能特征。您可以根据您的应用程序需求来选择最适合的队列实现。


1.LinkedList实现

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // 添加元素到队列尾部
        queue.add("Alice");
        queue.offer("Bob");

        // 获取队列头部元素并删除
        String head = queue.remove();
        System.out.println("Head of the queue (after remove): " + head);

        // 获取队列头部元素但不删除
        head = queue.element();
        System.out.println("Head of the queue (after element): " + head);

        // 添加更多元素到队列尾部
        queue.add("Charlie");
        queue.offer("David");

        // 遍历队列中的元素
        for (String s : queue) {
            System.out.println(s);
        }

        // 获取队列头部元素并删除
        head = queue.poll();
        System.out.println("Head of the queue (after poll): " + head);

        // 获取队列头部元素但不删除
        head = queue.peek();
        System.out.println("Head of the queue (after peek): " + head);
    }
}

输出结果:

Head of the queue (after remove): Alice
Head of the queue (after element): Bob
Bob
Charlie
David
Head of the queue (after poll): Bob
Head of the queue (after peek): Charlie

在这里插入图片描述


2.ArrayDeque实现

import java.util.ArrayDeque;
import java.util.Queue;

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

        // 添加元素到队列尾部
        queue.offer(10);
        queue.add(20);

        // 获取队列头部元素并删除
        int head = queue.remove();
        System.out.println("Head of the queue (after remove): " + head);

        // 获取队列头部元素但不删除
        head = queue.element();
        System.out.println("Head of the queue (after element): " + head);

        // 添加更多元素到队列尾部
        queue.offer(30);
        queue.add(40);

        // 遍历队列中的元素
        for (int num : queue) {
            System.out.println(num);
        }

        // 获取队列头部元素并删除
        head = queue.poll();
        System.out.println("Head of the queue (after poll): " + head);

        // 获取队列头部元素但不删除
        head = queue.peek();
        System.out.println("Head of the queue (after peek): " + head);
    }
}

输出结果:

Head of the queue (after remove): 10
Head of the queue (after element): 20
20
30
40
Head of the queue (after poll): 20
Head of the queue (after peek): 30

在这里插入图片描述

3.使用场景差异(底层结构不同)

LinkedList 和 ArrayDeque 都实现了 java.util.Queue 接口,但它们在底层数据结构和特性上有一些区别。

LinkedList:

  • 底层数据结构为双向链表,每个元素都包含前一个和后一个元素的引用。
  • 支持对队列两端的操作,因此在头部和尾部都可以高效地进行元素的插入和删除操作。
  • 链表的插入和删除操作的时间复杂度为 O(1)。
  • 链表不支持随机访问,需要遍历整个链表才能访问指定位置的元素。
  • 在使用迭代器遍历时,效率比较低。

ArrayDeque:

  • 底层数据结构为循环数组,可以在数组的两端进行元素的插入和删除操作。
  • 支持对队列两端的高效操作,因此在头部和尾部插入和删除元素的时间复杂度为 O(1)。
  • 支持随机访问,可以通过索引直接访问指定位置的元素。
  • 数组的大小会自动调整以适应元素的数量。
  • 在使用迭代器遍历时,效率较高。

如果需要经常在队列两端进行元素的插入和删除操作,且随机访问不是主要需求,可以选择 LinkedList。

如果需要在队列两端进行高效的插入和删除操作,并且需要支持随机访问操作,可以选择 ArrayDeque。

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

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

相关文章

CleanMyMac X .4.14.7如何清理 Mac 系统?

细心的用户发现苹果Mac电脑越用越慢&#xff0c;其实这种情况是正常的&#xff0c;mac电脑用久了会产生很多的缓存文件&#xff0c;如果不及时清理会影响运行速度。Mac系统在使用过程中都会产生大量系统垃圾&#xff0c;如不需要的系统语言安装包&#xff0c;视频网站缓存文件&…

Spring全家桶

官网 Spring | Home 一、市面上主流的Spring框架以及简介 Spring Framework&#xff1a;Spring Framework是最基础、最核心的Spring框架&#xff0c;提供了IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;等功能。它是其他Spring项目的基础&am…

统计学-R语言-5.2

文章目录 前言大数定理中心极限定理和抽样分布抽样分布样本均值的分布样本比例的分布练习 前言 本篇文章将继续上篇的进行介绍。 大数定理 大数定理大数定理”的另一种表达方式是“均值定理”&#xff0c;其含义是&#xff0c;随机变量X多个观察值的均值会随着观察值的增加越…

探索 Python:发现有趣的库——第 1 章:数据可视化之旅

在一个充满活力的科技世界中&#xff0c;数据分析专家“算法仙”和编程爱好者“代码侠”相遇了&#xff0c;决定一起踏上数据可视化的探险之旅。他们将运用 Matplotlib 和 Seaborn 这两个强大的 Python 库&#xff0c;将枯燥的数据转化为生动的图形。 算法仙&#xff1a;你好&…

【部署LLaMa到自己的Linux服务器】

部署LLaMa到自己的Linux服务器 1、Llama2 项目获取方法1&#xff1a;有git可以直接克隆到本地方法2&#xff1a;直接下载 2、LLama2 项目部署3、申请Llama2许可4、下载模型权重5、运行 1、Llama2 项目获取 方法1&#xff1a;有git可以直接克隆到本地 创建一个空文件夹然后鼠标…

vscode无法自动补全

前提&#xff1a;安装c/c插件 c/c插件功能非常强大&#xff0c;几乎能满足日常编码过程中常用的功能&#xff1b;因此也包含自动补全的功能&#xff0c;开启方法如下&#xff1a; 文件->首选项->设置&#xff1a; 扩展->c/c->Intellisense&#xff0c;找到Intell…

docker-compose和docker compose的区别

在docker实际使用中&#xff0c;经常会搭配Compose&#xff0c;用来定义和运行多个 Docker 容器。使用时会发现&#xff0c;有时候的指令是docker-compose&#xff0c;有时候是docker compose&#xff0c;下面给出解释。 docker官方文档&#xff1a;https://docs.docker.com/c…

go语言(四)----指针

1、指针的示意图 package mainimport "fmt"func swap(pa *int,pb *int) {var temp inttemp *pa*pa *pb*pb temp}func main() {var a int 10var b int 20swap(&a,&b)fmt.Println("a ",a,"b ",b)}

Lazada不懂英文能做吗?Lazada国内店铺好做吗?-站斧浏览器

Lazada不懂英文可以做吗&#xff1f; Lazada作为一个国际化的电商平台&#xff0c;为了方便用户来自不同国家和地区的购物需求&#xff0c;提供了多语言支持。对于不懂英文的用户来说&#xff0c;他们同样可以在Lazada上进行购物。 首先&#xff0c;Lazada平台上的界面和商品…

TRB 2024论文分享:融合Transformer和自监督学习的长时交通流预测模型

TRB&#xff08;Transportation Research Board&#xff0c;美国交通研究委员会&#xff0c;简称TRB&#xff09;会议是交通研究领域知名度最高学术会议之一&#xff0c;近年来的参会人数已经超过了2万名&#xff0c;是参与人数和国家最多的学术盛会。TRB会议几乎涵盖了交通领域…

【管理篇 / 升级】❀ 13. FortiOS 7.4固件升级新规则 ❀ FortiGate 防火墙

【简介】飞塔防火墙的固件升级一直是所有厂家中最好的。只要有注册官方帐号&#xff0c;有注册设备&#xff0c;并且只要有一台设备在服务期内&#xff0c;即可下载所有型号的所有版本的固件。即使其它设备服务期已过&#xff0c;也可以通过固件文件手动升级&#xff0c;避免防…

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

unable to create new native thread 问题处理

目录 unable to create new native thread 问题处理一、背景二、该问题产生可能原因三、处理过程3.1 确认内存是否不足3.2 确认机器线程数达到限制 四、总结 unable to create new native thread 问题处理 一、背景 生产实时集群部分节点的部分任务失败触发自动重启&#xff…

Unity之铰链关节和弹簧组件

《今天闪电侠他回来了&#xff0c;这一次他要拿回属于他的一切》 目录 &#x1f4d5;一、铰链关节组件HingeJoint 1. 实例 2. 铰链关节的坐标属性 ​3.铰链关节的马达属性Motor &#x1f4d5;二、弹簧组件 &#x1f4d5;三、杂谈 一、铰链关节组件HingeJoint 1. 实例 说…

基于Mapbox的Mvt矢量瓦片集成实践

目录 前言 一、数据说明 1、基本数据 2、属性数据 二、Mapbox集成Mvt矢量瓦片 1、关于访问令牌 2、定义html 3、初始地图 4、加载矢量瓦片 5、效果展示 总结 前言 熟悉矢量瓦片的朋友一定知道&#xff0c;在Webgis当中&#xff0c;矢量瓦片的格式除了pbf的格式&#x…

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

这里写目录标题 I.SuperPoint和SuperGIue的背景介绍特征点提取和匹配特征点的构成基于神经网络的方法优化方向一&#xff1a;增强特征点检测和描述子生成优化方向二&#xff1a;增强匹配和外点去除策略 背景和效果神经网络真的优于传统方案吗&#xff1f;DEMO演示为什么研究 2.…

Servlet系列:两种创建方式(xml,注解)

一、使用web.xml的方式配置&#xff08;Servlet2.5之前使用&#xff09; 在早期版本的Java EE中&#xff0c;可以使用XML配置文件来定义Servlet。在web.xml文件中&#xff0c;可以定义Servlet的名称、类名、初始化参数等。然后&#xff0c;在Java代码中实现Servlet接口&#x…

LeetCode、2336. 无限集中的最小数字(中等,小顶堆)

文章目录 前言LeetCode、2336. 无限集中的最小数字题目链接及类型思路代码题解 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) LeetCode、2336. 无限集中的最小数字 题目链接及类型 题目链接&#xff1a;2336. 无限集中的最小数字 类型&#xff1a;数据…

解析HTTP响应的状态码和头部信息

HTTP响应是客户端与服务器之间通信的重要部分。它包含了服务器对客户端请求的回应&#xff0c;以及与该响应相关的各种信息。在HTTP响应中&#xff0c;有两个关键部分&#xff1a;状态码和头部信息。 状态码 状态码是HTTP响应的第一部分&#xff0c;它是一个三位数字的代码&a…

【AI】RTX2060 6G Ubuntu 22.04.1 LTS (Jammy Jellyfish) 部署Chinese-LLaMA-Alpaca-2

下载源码 cd ~/Downloads/ai git clone --depth1 https://gitee.com/ymcui/Chinese-LLaMA-Alpaca-2 创建venv python3 -m venv venv source venv/bin/activate安装依赖 pip install -r requirements.txt 已安装依赖列表 (venv) yeqiangyeqiang-MS-7B23:~/Downloads/ai/Chi…