当前位置: 首页 > news >正文

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倍还放不下,则新创建数组的长度以实际为准

096fff4ecb9646109e9ce645f31dd871.png

底层源码1

e6c097835a924a30a53bf1b3b838a5a7.png

底层源码2

77cb1b274adb462db6629543d2d6a422.png

 

LinkedList集合底层原理

30704dd836064d80af55dff5aa631965.png

LinkedList 是 Java 中的一个基本数据结构,它实现了 List 接口,采用链表的方式来存储元素。链表由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。下面是关于 LinkedList 的一些详细介绍:

内部实现:

LinkedList 内部使用双向链表来存储元素每个节点都包含对前一个节点和后一个节点的引用。这种双向链表结构使得在链表中插入和删除元素的操作更加高效

9bde7ae9ae624b70a893661ea4f5f7b4.png

插入和删除操作:

由于链表的结构特点,LinkedList 对插入和删除操作具有良好的性能。在链表的任何位置插入或删除一个元素都可以在常量时间内完成,这是因为只需要调整相邻节点的引用。

随机访问:

与 ArrayList 不同,LinkedList 并不支持高效的随机访问。要访问链表中的特定位置的元素,必须从列表的开头或结尾开始遍历,直到找到目标位置。因此,访问特定位置的元素的时间复杂度是 O(N)。

迭代器:

LinkedList 提供了迭代器来遍历链表中的元素。这些迭代器支持快速的向前和向后移动,并且可以在常量时间内插入或删除当前位置的元素。

内存占用:

每个节点除了存储数据之外,还需要额外的空间来存储对前一个节点和后一个节点的引用。因此,相比于数组实现的 ArrayList,LinkedList 可能会占用更多的内存空间。

适用场景:

LinkedList 适用于频繁执行插入和删除操作,但不适用频繁进行随机访问的情况。例如,用作队列或栈的基础数据结构时,LinkedList 是一个很好的选择。

总的来说,LinkedList 在插入和删除操作上具有优势,但在随机访问上性能较差。因此,在选择数据结构时,应根据具体的使用场景和需求来进行选择。

ef8e5373aa3b49338fcb001e9257ab3d.png

 

 

http://www.lryc.cn/news/326879.html

相关文章:

  • 离线数仓(八)【DWD 层开发】
  • Jenkins用户角色权限管理
  • 简明conan教程
  • LeetCode刷题--- 等差数列划分 II - 子序列
  • kubectl 启用shell自动补全功能
  • 极简wordpress网站模板
  • 【python】(16)python的字典dict按照key或value排序的不同方法
  • 微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关
  • web CSS笔记1
  • js算法记录
  • 球面数据的几何深度学习--球形 CNN
  • MySQL学习笔记------SQL(1)
  • PMP能提前查成绩?还能改分数?别太离谱!
  • 【保姆级讲解服务器硬件的基础知识】
  • 并查集---力扣547省份的数量
  • stm32启动文件里面的__main和主函数main()
  • 曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)
  • 深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析
  • Python学习之-正则表达式
  • Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能
  • 数据仓库——雪花模式以及层次递归
  • Transformer的前世今生 day09(Transformer的框架概述)
  • Qt 压缩/解压文件
  • 【leetcode刷题之路】面试经典150题(8)——位运算+数学+一维动态规划+多维动态规划
  • JetBrains全家桶激活,分享 WebStorm 2024 激活的方案
  • Sublime 彻底解决中文乱码
  • 复旦大学EMBA校友出席两会建言献策助力中国发展
  • virtualbox导入vdi
  • 【信号处理】基于DGGAN的单通道脑电信号增强和情绪检测(tensorflow)
  • 使用 Docker Compose 部署 Spring Boot 应用