49天精通Java,第27天,队列、双端队列、优先队列

news2025/2/21 21:38:46

在这里插入图片描述

目录

    • 一、队列与双端队列
    • 二、Queue和Deque
    • 三、api对比
      • 1、add和offer区别
      • 2、remove和poll
      • 3、element和peek
    • 四、优先队列
      • 1、PriorityQueue常用方法
      • 2、ArrayDeque常用方法

大家好,我是哪吒。

一、队列与双端队列

双端队列是一种特殊的队列,它的两端都可以进行插入和删除操作。这种队列的实现方式是使用两个指针,一个指针指向队列的头部,另一个指针指向队列的尾部。当需要插入或删除元素时,只需要移动指针即可。

双端队列的主要优点是可以在队列的两端进行操作,因此具有较高的效率。此外,双端队列还具有一些其他的优点,例如可以在队列的两端进行查询操作,因此具有较高的查询效率。

双端队列的缺点是插入和删除操作的时间复杂度都是O(1),因此在处理大量数据时可能会导致性能问题。此外,双端队列的空间复杂度也是O(1),因此在插入和删除元素时需要使用额外的空间。

二、Queue和Deque

Queue以及Deque都是继承于Collection,Deque是Queue的子接口。

Queue是FIFO的单向队列,Deque是双向队列。

Queue有一个直接子类PriorityQueue,而Deque中直接子类有两个:LinkedList以及ArrayDeque。

PriorityQueue的底层数据结构是数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的。

ArrayDeque是无初始容量的双端队列,LinkedList则是双向链表。

PriorityQueue可以作为堆使用,而且可以根据传入的Comparator实现大小的调整,会是一个很好的选择。
ArrayDeque通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。

三、api对比

1、add和offer区别

  • add() : 添加元素,如果添加成功则返回true,如果队列是满的,则抛出异常;
  • offer() : 添加元素,如果添加成功则返回true,如果队列是满的,则返回false;

2、remove和poll

  • remove() : 移除队列头的元素并且返回,如果队列为空则抛出异常;
  • poll() : 移除队列头的元素并且返回,如果队列为空则返回null;

Deque新增了一个pop方法,也是移除队列头的元素并且返回,如果队列为空则抛出异常。

3、element和peek

  • element() :返回队列头元素但不移除,如果队列为空,则抛出异常;
  • peek() :返回队列头元素但不移除,如果队列为空,则返回null;

因此,增加推荐使用offer,移除推荐使用poll,获取元素推荐使用peek。

四、优先队列

优先队列中的元素可以按照任意的顺序插入,但会按照有序的顺序获取。

优先队列常用结构是PriorityQueue和ArrayDeque。

也就是在调用remove时,总是删除队列中最小的元素。

优先队列使用堆作为存储数据结构,堆是一个自组织的二叉树,其添加和删除操作会让最小的元素移动到根,而不必花费时间对元素进行排序。

优先队列的主要用途是调度。每个任务有一个优先级,任务以随机顺序插入到队列中,每当启动一个新的任务时,将从队列中删除优先级最高的任务。

1、PriorityQueue常用方法

PriorityQueue是一个基于优先级的无界优先队列,它的元素按照元素的优先级进行排序。

  1. offer(Object obj):将一个对象添加到PriorityQueue的头部;
  2. poll():从PriorityQueue的头部移除一个对象;
  3. peek():返回PriorityQueue的头部元素,但不移除它;
  4. element():返回PriorityQueue的头部元素,并移除它;
  5. isEmpty():判断PriorityQueue是否为空;

2、ArrayDeque常用方法

ArrayDeque是一个基于数组的有界优先队列,它的元素按照元素的插入顺序进行排序。

  1. offer(Object obj):将一个对象添加到ArrayDeque的头部;
  2. pollLast():返回ArrayDeque的尾部元素,但不移除它;
  3. pollFirst():返回ArrayDeque的头部元素,但不移除它;
  4. peekLast():返回ArrayDeque的尾部元素,但不移除它;
  5. peekFirst():返回ArrayDeque的头部元素,但不移除它;
  6. isEmpty():判断ArrayDeque是否为空。

在这里插入图片描述

🏆本文收录于,49天精通Java从入门到就业。

全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

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

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

相关文章

吴军《计算之魂》读后感

前言 断断续续,终于完成了这本书的第一次通读,记录下自己的一些想法。 先说一个小故事。前段时间家里买了一个小鱼缸,问我有没有办法让水自动循环,但不想用电。没有好的想法,去小某书上搜了下,好多案例教…

【哈士奇赠书活动 - 18期】-〖Flask Web全栈开发实战〗

文章目录 ⭐️ 赠书活动 - 《Flask Web全栈开发实战》⭐️ 编辑推荐⭐️ 内容提要⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书活动 - 《Flask Web全栈开发实战》 内容简介: 《Flask Web全栈开发实战》围绕 Flask 框架,详细地讲解了使用 Flask 开发网站的各项技…

vue2项目中使用本机图片的一些问题

前后端分离项目,(vue2springboot2.6.3) 前端上传图片,后端将图片保存在本地。当前端使用上传的图片时出现的一些问题说明。 前端上传图片文件,后端接收到图片文件后将图片保存到vue项目的src/assets/club目录下,如下…

VMware vSphere Replication 8.7 (for vSphere 8.0U1) - 虚拟机复制和数据保护

请访问原文链接:https://sysin.org/blog/vmware-vsphere-replication-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 新增功能 vSphere Replication 8.7 | 2023 年 4 月 18 日 | 内部版本 21591677 vSphere Re…

GPT4.0+Midjourney=最佳组合,简单玩法

以下是我设计的一个简单的组合玩法,操作如下: 问gpt4: Here is a MidJourney Prompt Formula: A detailed image of [Subject] [doing something interesting] during [time of day], taken with a [type of camera], using [type of lens] with cinema…

ChatGPT会对我们日常生活带来什么影响?这些技术会改变我们学习阅读工作方式吗?

ChatGPT会对我们日常生活带来什么影响?这些技术会改变我们学习阅读工作方式吗? AI 这个话题很火,我也一直在关注着,很多人甚至觉得 AI 会改变世界,也许你会好奇:ChatGPT 会在三年内终结编程吗?A…

基于gitlab搭建Drone CI

drone简介: drone官方文档:https://docs.drone.io/ drone跟Jenkins一样,可实现持续集成,就是可以帮助我们解决重复的代码构建,自动化测试,发布等重复劳动,通过简单一个提交代码的动作&#xff…

Text-to-3D 任务论文笔记: Latent NeRF

文章目录 概述相关工作3D形状合成使用2D监督的text-to-3D 任务 方法前置知识LDMScore Distillation Latent NeRF文本引导RGB refinementSketch-Shape Guidance对于显式形状的Latent-Paint 实验实验细节文本引导的生成RGB RefinementTextual-Inversion Sketch-Shape GuidanceLat…

使用Handler创建一个Android秒表应用

0、应用是一个有活动、布局和其他资源组成的集合。其中一个活动是应用的主活动。每个应用都有一个主活动,在文件AndroidManifest.xml中指定。 1、默认地,每个应用都在自己的进程中运行。这样有助于保证应用安全。 2、但是可以使用startActivity(intent)传…

信息安全支撑技术

信息安全支撑技术 密码学密码学发展古典密码近代密码学现代密码学 基本保密通信模型密码系统的安全性密码学技术在信息安全中的应用对称密码算法非对称密码算法其他密码服务哈希函数消息认证码数字签名 公钥基础设施(PKI)CA:认证权威RA&#…

九耶丨阁瑞钛伦特-SpringCloud(六)

Spring Cloud Config 是一个基于 Spring Boot 实现的分布式配置管理工具,它专注于管理各种环境中的应用程序配置,例如开发环境、测试环境和生产环境等。它提供了一个集中的配置服务器,允许在运行时动态地管理和更新应用程序的配置信息&#x…

10 个超赞的 C 语言开源项目

今天给大家分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助! 01 Webbench Webbench是一个在 Linux 下使用的非常简单的网站压测工具。 它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能。 最多可以…

Unity版本使用情况统计(更新至2023年4月)

本期UWA发布的内容是第十二期Unity版本使用统计,统计周期为2022年11月至2023年4月,数据来源于UWA网站(www.uwa4d.com)性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势,了解近半年来哪些Unity版本的使用概率更…

Java经典笔试题—day05

Java经典笔试题—day05 🔎选择题🔎编程题🥝统计回文🥝连续子数组最大和 🔎结尾 🔎选择题 (1)下面的程序 编译运行后,在屏幕上显示的结果是() public class Test {publi…

使用敏捷开发工具做敏捷需求管理流程

上一篇我们介绍了如何管理产品路线图,这一篇我们介绍下如何管理产品Backlog。 史诗故事通常都是比较大的故事,所以我们需要将史诗故事规划到产品Backlog中,以便让团队在产品Backlog中对史诗故事进行拆分,将其拆解为更小的用户故事…

Kubernetes对象之PersistentVolume,PersistentVolumeClaim和StorageClass

前面我们学习了Kubernetes中的Volume,我们可以发现前文中的Volume(无论何种类型)和使用它的Pod都是一种静态绑定关系,在Pod定义文件中,同时定义了它使用的Volume。在这种情况下,Volume是Pod的附属品&#x…

linux安装redis服务

linux环境采用centos7 1.下载redis安装包 官网下载地址:https://redis.io/download/ 2.安装redis依赖 yum install -y gcc tcl3.上传安装包并解压 tar -xzf redis-6.2.12.tar.gz4.编译安装 进入目录下并安装 cd redis-6.2.12 make && make install默认…

Python 密码破解指南:15~19

协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【OpenDocCN 饱和式翻译计划】,采用译后编辑(MTPE)流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神,试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十五、…

基于springboot会员制医疗预约服务管理信息系统

开发技术介绍 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景&#xff…

APP多版本并行更新方案

目录 App为什么要更新版本更新类型分析应该如何解决升级样式的收集表结构 App为什么要更新版本 任何一款APP都不可能完美,功能也不可能完善,需要不断迭代更新完善APP。例如:随着业务的不断发展而叠加的功能、产品发展到一定程度需要大改版提升…