ArrayList和LinkedList有什么区别?
ArrayList和LinkedList的区别
ArrayList 和 LinkedList 是 Java 中常用的两种集合类,它们都实现了 List 接口,但在内部实现和性能上有一些区别。
内部实现:
ArrayList 使用数组实现,它的元素在内存中是连续存储的,每个元素占用固定大小的内存空间。
LinkedList 使用链表实现,它的元素在内存中可以是分散存储的,每个元素可以有自己的大小。
随机访问:
ArrayList 支持高效的随机访问,因为它可以通过索引直接访问元素,时间复杂度为 O(1)。
LinkedList 不支持高效的随机访问,如果要访问第 N 个元素,需要从头部或尾部开始遍历链表,时间复杂度为 O(N)。
插入和删除操作:
ArrayList 在列表的中间插入或删除元素时,需要将插入或删除位置后面的元素都向后或向前移动,时间复杂度为 O(N)。
LinkedList 在列表的中间插入或删除元素时,只需要改变相邻节点的指针,时间复杂度为 O(1)。
内存占用:
ArrayList 在添加或删除元素时可能会进行数组的扩容或收缩操作,这可能会导致一些额外的内存消耗和性能损失。
LinkedList 每个元素都需要额外的空间来存储指向下一个元素的指针,可能会占用更多的内存空间。
迭代器性能:
ArrayList 的迭代器性能通常比 LinkedList 的好,因为 ArrayList 的数据在内存中是连续存储的,迭代时不会产生额外的指针跳转操作。
LinkedList 的迭代器性能可能较差,因为它的数据在内存中是分散存储的,迭代时可能会频繁地进行指针跳转。
综上所述,当需要频繁进行随机访问操作时,选择 ArrayList 更合适;当需要频繁进行插入和删除操作时,选择 LinkedList 更合适。
ArrayList集合底层原理
ArrayList 是 Java 中的一个基本数据结构,它实现了 List 接口,采用动态数组的方式来存储元素。下面是关于 ArrayList 的详细介绍:
内部实现:
ArrayList 内部使用数组来存储元素。数组的大小可以动态增长,以容纳新的元素。当数组容量不足以容纳新元素时,ArrayList 会自动进行扩容操作,通常会创建一个新的数组,并将原数组中的元素复制到新数组中。
随机访问:
ArrayList 支持高效的随机访问。由于元素存储在数组中,并且数组的元素在内存中是连续存储的,因此可以通过索引来直接访问数组中的元素。因此,访问特定位置的元素的时间复杂度是 O(1)。
插入和删除操作:
尽管 ArrayList 对随机访问操作性能良好,但对于插入和删除操作,可能会涉及移动其他元素的情况。例如,在列表的中间插入一个元素,需要将插入位置后面的元素都向后移动一个位置。因此,插入和删除操作的时间复杂度通常是 O(N)。
迭代器:
ArrayList 提供了迭代器来遍历列表中的元素。迭代器支持快速的向前遍历,并且可以在常量时间内插入或删除当前位置的元素。
内存占用:
ArrayList 的内存占用相对较小。它只需要一个数组来存储元素,因此不会产生额外的指针或引用。但是,由于可能存在扩容操作,ArrayList 可能会分配比实际需要更多的内存空间。
适用场景:
ArrayList 适用于需要频繁进行随机访问操作的情况,例如需要根据索引获取元素或更新元素的值。它也适用于那些对列表进行遍历、迭代和转换的情况。
总的来说,ArrayList 提供了一种灵活且高效的数据结构,适用于各种需要列表功能的场景。然而,需要注意的是,对于大量插入和删除操作的情况,可能会有更适合的数据结构选择,比如 LinkedList。
扩容机制:
1.利用空参创建的集合,在底层创建一个默认长度为0的数组
2.添加第一个元素时,底层会创建一个新的长度为10的数组
3.存满时,会扩容一个1.5倍
4.如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
底层源码1
底层源码2
LinkedList集合底层原理
LinkedList 是 Java 中的一个基本数据结构,它实现了 List 接口,采用链表的方式来存储元素。链表由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。下面是关于 LinkedList 的一些详细介绍:
内部实现:
LinkedList 内部使用双向链表来存储元素。每个节点都包含对前一个节点和后一个节点的引用。这种双向链表结构使得在链表中插入和删除元素的操作更加高效。
插入和删除操作:
由于链表的结构特点,LinkedList 对插入和删除操作具有良好的性能。在链表的任何位置插入或删除一个元素都可以在常量时间内完成,这是因为只需要调整相邻节点的引用。
随机访问:
与 ArrayList 不同,LinkedList 并不支持高效的随机访问。要访问链表中的特定位置的元素,必须从列表的开头或结尾开始遍历,直到找到目标位置。因此,访问特定位置的元素的时间复杂度是 O(N)。
迭代器:
LinkedList 提供了迭代器来遍历链表中的元素。这些迭代器支持快速的向前和向后移动,并且可以在常量时间内插入或删除当前位置的元素。
内存占用:
每个节点除了存储数据之外,还需要额外的空间来存储对前一个节点和后一个节点的引用。因此,相比于数组实现的 ArrayList,LinkedList 可能会占用更多的内存空间。
适用场景:
LinkedList 适用于频繁执行插入和删除操作,但不适用频繁进行随机访问的情况。例如,用作队列或栈的基础数据结构时,LinkedList 是一个很好的选择。
总的来说,LinkedList 在插入和删除操作上具有优势,但在随机访问上性能较差。因此,在选择数据结构时,应根据具体的使用场景和需求来进行选择。
相关文章:

ArrayList和LinkedList有什么区别?
ArrayList和LinkedList的区别 ArrayList 和 LinkedList 是 Java 中常用的两种集合类,它们都实现了 List 接口,但在内部实现和性能上有一些区别。 内部实现: ArrayList 使用数组实现,它的元素在内存中是连续存储的,每…...

离线数仓(八)【DWD 层开发】
前言 1、DWD 层开发 DWD层设计要点: (1)DWD层的设计依据是维度建模理论(主体是事务型事实表(选择业务过程 -> 声明粒度 -> 确定维度 -> 确定事实),另外两种周期型快照事实表和累积型…...

Jenkins用户角色权限管理
Jenkins作为一款强大的自动化构建与持续集成工具,用户角色权限管理是其功能体系中不可或缺的一环。有效的权限管理能确保项目的安全稳定,避免敏感信息泄露。 1、安装插件:Role-based Authorization Strategy 系统管理 > 插件管理 > 可…...
简明conan教程
简明conan教程 1 关于conan1.1 来源1.2 作用 2 安装conan2.1 ubuntu2.1.1 安装python32.1.2 安装conan 2.2 Windows2.2.1 安装python32.2.2 安装conan 2.3 验证conan是否成功2.4 命令解释2.4.1 Consumer commands2.4.2 Creator commands2.4.3 Package development commands2.4.…...
LeetCode刷题--- 等差数列划分 II - 子序列
个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动态规划算…...

kubectl 启用shell自动补全功能
官网手册参考:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统:centos7 补全脚本依赖于工具 bash-completion, 所以要先安装它(可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…...

极简wordpress网站模板
Pithy设计师wordpress网站模板 精练简洁的wordpress模板,设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329...
【python】(16)python的字典dict按照key或value排序的不同方法
系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…...
微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关
原创作者:田超凡(程序员田宝宝) 版权所有,引用请注明原作者,严禁复制转载 Part 1 理论部分 1 网关类别有哪些? 常见的网关类别有三种:开放API(Open API)网关、微服务…...

web CSS笔记1
CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及…...

js算法记录
> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…...

球面数据的几何深度学习--球形 CNN
目录 一、说明二、球形 CNN概述三、球面数据的对称性四、标准(平面)CNN的局限性五、卷积并发症六、球面卷积七、球面卷积是不够的 一、说明 球面数据的几何深度学习–球形 CNN。通过对物理世界的平移对称性进行编码,卷积神经网络 ࿰…...

MySQL学习笔记------SQL(1)
关系型数据库(RDBMS) 建立在关系模型基础上,由多张相互连接的二维表组成的数据库 特点:使用表储存数据,格式统一,便于维护 使用SQL语言操作,标准统一,使用方便 SQL通用语法 SQL…...

PMP能提前查成绩?还能改分数?别太离谱!
震惊!3月10日PMP考试才结束没多久,昨天就有学员收到了查分邮件,寄信人自称自己是内部人员,可以提前查询到成绩并直接修改成绩。 这也太离谱了吧!在此,小赛想说,PMP考试是一个公正、严格的考试体…...
【保姆级讲解服务器硬件的基础知识】
服务器硬件基础知识 1. 前言2. 中央处理器(CPU)3. 内存(RAM)4. 存储设备5. 主板6. 电源供应单元(PSU)7. 冷却系统8. 网络连接9. 扩展插槽和端口10. 管理功能 🌈🌈🌈&…...
并查集---力扣547省份的数量
假设:有一群小混混打架,小弟们可能互相不认识,如果要确定他们是一伙的,就需要确定他们的组长是不是一个,但是每个组长的领导可能又不一样,所以要找到最大的那个领导,才能确定是一伙的。 我们先…...

stm32启动文件里面的__main和主函数main()
一、__main和main()之间的关系 先来对stm32启动过程简单学习 启动文件里面的Reset_Handler: 调用过程: stm32在启动后先进入重启中断函数Reset_Handler,其中会先后调用SystemInit和__main函数, __main函数属于c库函数&…...

曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 什么是Reeds-Shepp曲线?2 Reeds-Shepp曲线的运动模式3 Reeds-Shepp曲线算法原理3.1 坐标变换3.2 时间翻转(time-flip)3.3 反射变换(reflect)3.4 后向变换(backwards) 4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 ǵ…...

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析
iOS开发作为移动应用开发的重要领域之一,对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面,从创建第一个iOS程序到纯代码实现iOS开发,带领读者全面了解iOS应用程序的开发流程和技术要点。 📱 第一个iOS程序 在创建第…...

Python学习之-正则表达式
目录 前言:1.re.serach1.1例子: 2.re.match2.1示例1:2.2 示例2: 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1:4.2 示例2: 5.re.split5.1 示例1:5.2 示例2:5.3 示例3: 6.re.sub6.1 示例&#…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...