Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别

我是你爹

    • `LinkedList<>` 和 `ArrayDeque<>` 的区别
    • Queue接口 和 Deque接口
      • 区别
      • `Queue` 的用法
      • `Deque` 的用法

LinkedList<>ArrayDeque<> 的区别

1. 数据结构实现方式

  • LinkedList
    • 基于链表结构,是一个双向链表
    • 每个元素都是节点,包含值和指向前一个和后一个节点的指针。
  • ArrayDeque
    • 基于动态数组实现,内部维护了一个循环数组
    • 当容量不足时,会重新分配更大的数组并复制元素。

2. 性能差异

  • 插入和删除操作
    • LinkedList:在链表的头部和尾部进行插入和删除的时间复杂度是 (O(1))。但是,链表的中间插入和删除需要遍历,时间复杂度为 (O(n))。
    • ArrayDeque:在队列的头部和尾部进行插入和删除的时间复杂度是 (O(1)),因为它是一个双端队列,但在动态扩展数组容量时会有额外的开销。
  • 随机访问
    • LinkedList:不支持随机访问。要访问中间的某个元素,需要遍历整个链表,时间复杂度为 (O(n))。
    • ArrayDeque:不提供随机访问,但由于其基于数组实现,整体的内存布局更加紧凑,缓存命中率高。

3. 内存开销

  • LinkedList:由于每个节点都有前向和后向指针,因此在存储元素时存在较大的内存开销。
  • ArrayDeque:内存使用效率较高,但当数组扩容时,需要占用更多的内存空间来存储新数组和复制元素。

4. 允许存储 null 元素

  • LinkedList:允许存储 null 值。
  • ArrayDeque:不允许存储 null 值,因为 null 通常用来指示队列为空的状态,避免引起歧义。

5. 使用场景

  • LinkedList:适合需要频繁在链表中间插入或删除的场景,或者需要作为双端链表(如实现 Deque 时)。
  • ArrayDeque:性能一般比 LinkedList 更好,适合用作栈、队列和双端队列。通常 ArrayDeque 被认为是栈和队列的更好的选择,因为它的性能更稳定、效率更高。

QueueDeque 是 Java 中的接口,分别用于定义队列(FIFO)和双端队列(可作为栈或队列)。它们的用法有所不同,下面为你详细介绍 QueueDeque 的常见用法以及它们支持的方法。

Queue接口 和 Deque接口

区别

特性Queue 接口Deque 接口
插入位置只能在尾部插入可以在头部和尾部插入
删除位置只能从头部删除可以从头部和尾部删除
数据结构先进先出(FIFO)支持先进先出(FIFO)和后进先出(LIFO)
常见实现类LinkedListPriorityQueueLinkedListArrayDeque
常用方法add()offer()poll()peek()addFirst()addLast()removeFirst()removeLast()
典型应用场景任务排队消息队列栈实现双端队列缓存机制
  • Queue 主要用于实现简单的先进先出(FIFO)队列,只能在尾部插入、头部移除,适合任务调度和消息处理。
  • Deque 更加灵活,可以在两端进行操作,既可以用作队列,也可以用作栈,适合需要双端操作的场景。

Queue 的用法

Queue 是一个单端队列接口,遵循 先进先出(FIFO) 的原则。常见的实现类包括 LinkedListPriorityQueueQueue 接口主要用于任务排队、消息队列等应用场景。

常见实现

Queue<Integer> queue = new LinkedList<>();
// 或
Queue<Integer> queue = new ArrayDeque<>();

主要方法

  • add(E e):将元素 e 添加到队列尾部,如果队列已满则抛出异常。
  • offer(E e):将元素 e 添加到队列尾部,返回 true 表示成功,false 表示失败。
  • remove():移除并返回队列头部的元素,如果队列为空,则抛出 NoSuchElementException
  • poll():移除并返回队列头部的元素,如果队列为空,则返回 null
  • element():返回队列头部的元素,但不移除,如果队列为空,则抛出 NoSuchElementException
  • peek():返回队列头部的元素,但不移除,如果队列为空,则返回 null

示例代码

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

// 添加元素
queue.add(1);
queue.offer(2);

// 获取队列头部元素
System.out.println(queue.peek()); // 输出:1

// 移除队列头部元素
System.out.println(queue.poll()); // 输出:1

// 获取并移除头部元素
System.out.println(queue.remove()); // 输出:2

// 检查队列是否为空
System.out.println(queue.isEmpty()); // 输出:true

使用场景

  • 任务排队:适用于管理任务的执行顺序,确保按顺序进行处理。
  • 消息队列:用于消息的排队和处理。

Deque 的用法

Deque(Double-Ended Queue,双端队列)是一个接口,允许在队列的两端插入和删除元素,支持既作为**队列(FIFO)使用,也可以作为栈(LIFO)**使用。常见的实现类有 LinkedListArrayDeque

常见实现

Deque<Integer> deque = new LinkedList<>();
// 或
Deque<Integer> deque = new ArrayDeque<>();

主要方法

  • 在队首操作

    • addFirst(E e):将元素 e 添加到队列的头部,如果失败则抛出异常。
    • offerFirst(E e):将元素 e 添加到队列的头部,返回 true 表示成功,false 表示失败。
    • removeFirst():移除并返回队列头部的元素,如果队列为空则抛出 NoSuchElementException
    • pollFirst():移除并返回队列头部的元素,如果队列为空则返回 null
    • getFirst():返回队列头部的元素,但不移除,如果队列为空则抛出 NoSuchElementException
    • peekFirst():返回队列头部的元素,但不移除,如果队列为空则返回 null
  • 在队尾操作

    • addLast(E e):将元素 e 添加到队列的尾部,如果失败则抛出异常。
    • offerLast(E e):将元素 e 添加到队列的尾部,返回 true 表示成功,false 表示失败。
    • removeLast():移除并返回队列尾部的元素,如果队列为空则抛出 NoSuchElementException
    • pollLast():移除并返回队列尾部的元素,如果队列为空则返回 null
    • getLast():返回队列尾部的元素,但不移除,如果队列为空则抛出 NoSuchElementException
    • peekLast():返回队列尾部的元素,但不移除,如果队列为空则返回 null

作为栈使用的方法

  • push(E e):将元素 e 压入栈(等同于 addFirst())。
  • pop():移除并返回栈顶元素(等同于 removeFirst())。

示例代码

Deque<Integer> deque = new ArrayDeque<>();

// 在头部和尾部插入元素
deque.addFirst(1);   // 头部插入 1
deque.addLast(2);    // 尾部插入 2

// 获取头部和尾部元素
System.out.println(deque.getFirst()); // 输出:1
System.out.println(deque.getLast());  // 输出:2

// 在头部和尾部移除元素
deque.removeFirst(); // 移除头部元素
deque.removeLast();  // 移除尾部元素

// 作为栈使用
deque.push(3);       // 压入栈顶(头部)
System.out.println(deque.pop());  // 弹出栈顶,输出:3

使用场景

  • 双端操作:需要在两端进行插入和删除的场景。
  • 栈和队列Deque 可以既当作栈使用,也可以当作队列使用,灵活性更高。
  • 实现复杂的数据结构:例如支持同时在两端操作的缓存机制、滑动窗口等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows 安装Ubuntu 后如何使用

windows 安装Ubuntu 后如何使用 youtube链接 https://www.youtube.com/watch?vPaEcQmgEz78哔哩哔哩视频 https://www.bilibili.com/video/BV1tW42197za/?spm_id_from333.999.0.0两个视频是一样的安装Ubuntu 安装docker的教程&#xff0c;不执行docker的安装即可 安装完毕后…

IDEA leetcode插件代码模板配置,登录闪退解决

前言 最近换电脑&#xff0c;配置idea时和原来的模板格式不一样有点难受&#xff0c;记录一下自己用的模板&#xff0c;后期换电脑使用&#xff0c;大家也可以使用&#xff0c;有更好的地方可以分享给我~ IDEA leetcode插件代码模板配置,登录闪退解决 前言1 下载IDEA leetcode…

kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署

前言&#xff1a;半月前在公司生产环境上离线部署了k8s集群Victoria Metrics(二开版)自研版夜莺 监控平台的搭建&#xff0c;下面我租用3台华为云服务器演示部署kubesphere环境-本地Harbor仓库k8s集群&#xff08;单master节点 & 单master节点&#xff09;Prometheus监控部…

Node.js | npm下载安装及环境配置教程

前言&#xff1a; npm 是 Nodejs 下的包管理器&#xff0c;在下载 Node.js 后自动安装&#xff0c;因此本文同时适合 Node.js / npm 的下载安装及环境配置。 一、软件安装 Node.js中文网官网下载页&#xff1a;Node.js 中文网 (nodejs.com.cn) 1&#xff09;进入下载页&#xf…

C++ 的发展

目录 C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&#xf…

游戏引擎学习第14天

1. 为什么关注内存管理&#xff1f; 内存分配是潜在的失败点&#xff1a; 每次进行内存分配&#xff08;malloc、new等&#xff09;时&#xff0c;都可能失败&#xff08;例如内存不足&#xff09;。这种失败会引入不稳定性或不可预测性&#xff0c;需要额外的错误处理逻辑。 …

QT6学习第一天

QT6安装和示例运行 QT介绍QT特点QT开发框架QT Quick和QML介绍Qt Widgets和Qt QuickQT6下载安装QT Creator介绍QT Creator界面介绍 QT介绍 Qt是一个跨平台的应用程序和UI开发框架&#xff0c;可用于桌面、嵌入式和移动平台的应用程序和用户界面的开发。 使用Qt只需一次性开发应…

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起&#xff0c;旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验&#xff0c;构建一套高效且标准化的操作流程&#xff08;SOP&#xff09;变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架&#xff0c;并介绍如何利用智能知识库技术…

基于Python爬虫大屏可视化的热门旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

04 - Clickhouse-21.7.3.14-2单机版安装

目录 一、准备工作 1、确定防火墙处于关闭状态 2、CentOS 取消打开文件数限制 3、安装依赖 4、CentOS取消SELINUX 二、单机安装 2.1、下载安装 2.2、安装这4个rpm包 2.3、修改配置文件 2.4、启动服务 2.5、关闭开机自启 2.6、使用Client连接server 一、准备工作 1…

uni-app移动端与PC端兼容预览PDF文件

过程遇到的问题 1、如果用的是最新的版本的pdfjs的话&#xff0c;就会报Promise.withResolvers 不是一个方法的错误&#xff0c;原因是Promise.withResolvers是ES15新特性&#xff0c;想了解可参考链接&#xff0c;这里的解决方案是将插件里的涉及到Promise.withResolvers的地…

shell编程--永久环境变量和字符串显位

环境变量 echo $HOME 在终端输出后会显示家目录有个root变量 我们会提出个疑问为什么平时我们在终端输入sl 或者which等等命令会输出一些内容呢&#xff0c;这是因为这些命令都有对应的环境变量。 我们查看一下环境变量 在终端输入&#xff1a; echo $PATH 我们看一下输出…

vue3 + vite 进行axios请求封装及接口API的统一管理

前言 在Vue 3项目中使用Vite进行开发时&#xff0c;对axios进行请求封装以及统一管理接口API是非常常见的做法。这不仅可以提高代码的复用性和可维护性&#xff0c;还能统一处理请求和响应&#xff0c;管理错误处理逻辑等。下面是一个详细的步骤和示例代码&#xff0c;来说明如…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…

关于win11电脑连接wifi的同时,开启热点供其它设备连接

背景&#xff1a; 我想要捕获手机流量&#xff0c;需要让手机连接上电脑的热点。那么问题来了&#xff0c;我是笔记本电脑&#xff0c;只能连接wifi上网&#xff0c;此时我的笔记本电脑还能开启热点供手机连接吗&#xff1f;可以。 上述内容&#xff0c;涉及到3台设备&#x…

【OpenGL】OpenGL简介

文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说&#xff0c;本身并不是一个API&#xff0c;它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…

AI写作(十)发展趋势与展望(10/10)

一、AI 写作的崛起之势 在当今科技飞速发展的时代&#xff0c;AI 写作如同一颗耀眼的新星&#xff0c;迅速崛起并在多个领域展现出强大的力量。 随着人工智能技术的不断进步&#xff0c;AI 写作在内容创作领域发挥着越来越重要的作用。据统计&#xff0c;目前已有众多企业开始…

ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言 本篇文章介绍的是ROS高效进阶内容&#xff0c;使用URDF 语言&#xff08;xml格式&#xff09;做一个差速轮式机器人模型&#xff0c;并使用URDF的增强版xacro&#xff0c;对机器人模型文件进行二次优化。 差速轮式机器人&#xff1a;两轮差速底盘由两个动力轮位于底盘左…

Java 网络编程(二)—— TCP流套接字编程

TCP 和 UDP 的区别 在传输层&#xff0c;TCP 协议是有连接的&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 而UDP 协议是无连接的&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有连接和无连接的区别是在进行网络通信的时候&#xff0c;…