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 示例&#…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
