深入解析:LinkedList 和ArrayList 的区别?

news/2025/12/6 15:57:35/文章来源:https://www.cnblogs.com/tlnshuju/p/19315986

深入解析:LinkedList 和ArrayList 的区别?

2025-12-06 15:54  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

核心概括

详细对比表格

深入原理分析

1. ArrayList:动态数组

2. LinkedList:双向链表

数据结构差异

时间复杂度对比

内存占用与扩容

适用场景

选择 ArrayList 的情况(绝大多数场景):

选择 LinkedList 的情况:

线程安全


核心概括

  • ArrayList:底层是动态数组。像一辆在轨道上运行的列车,车厢(元素)在内存中连续排列。

  • LinkedList:底层是双向链表。像一队手拉手的人,每个人(节点)都知道自己前后是谁,但他们在内存中的位置是分散的。

详细对比表格

深入原理分析

1. ArrayList:动态数组
  • 工作原理

    1. 内部维护一个 Object[] elementData 数组。

    2. 当使用 get(int index) 时,直接通过数组下标 elementData[index] 访问,所以速度极快。

    3. 当在列表中间或开头插入元素时(add(int index, E element)),例如在位置 i 插入,需要将 i 之后的所有元素都向后移动一位,这是一个 O(n) 操作。

    4. 当数组容量不足时,会创建一个新的更大的数组(通常是原来的1.5倍),并将旧数组的数据拷贝过去,这个过程称为扩容,性能开销较大。

  • 代码示例:体现插入的劣势

ArrayList arrayList = new ArrayList<>();
// 先添加100000个元素
for (int i = 0; i < 100000; i++) {arrayList.add(i);
}
long start = System.currentTimeMillis();
arrayList.add(0, -1); // 在开头插入一个元素,需要移动后面所有元素!
long end = System.currentTimeMillis();
System.out.println("ArrayList time: " + (end - start) + "ms");
2. LinkedList:双向链表
  • 工作原理

    1. 内部定义了一个 Node 节点类,包含 item(数据)、next(指向下一个节点)、prev(指向上一个节点)。

    2. 当需要访问第 index 个元素时,get(int index) 方法会判断 index 更靠近头部还是尾部,然后从头或尾开始遍历,直到找到目标位置。这是一个 O(n) 操作。

    3. 当在已知位置插入或删除元素时,例如在节点 A 和 B 之间插入节点 C,只需要修改引用:

      • A.next = C

      • C.prev = A

      • C.next = B

      • B.prev = C
        这个操作是 O(1) 的。

  • 代码示例:体现插入的优势

LinkedList linkedList = new LinkedList<>();
// 先添加100000个元素
for (int i = 0; i < 100000; i++) {linkedList.add(i);
}
long start = System.currentTimeMillis();
linkedList.add(0, -1); // 在开头插入,只需修改第一个节点的prev和新节点的next
long end = System.currentTimeMillis();
System.out.println("LinkedList time: " + (end - start) + "ms");

数据结构差异

LinkedList 基于双向链表实现,每个元素(节点)存储数据及前后节点的引用。
ArrayList 基于动态数组实现,元素在内存中连续存储,通过索引直接访问。

时间复杂度对比

插入/删除操作
LinkedList 在头尾插入/删除时间复杂度为 O(1),中间位置为 O(n)(需遍历定位)。
ArrayList 尾部插入/删除为 O(1),中间或头部操作可能导致数组移动,平均为 O(n)。

随机访问
LinkedList 需遍历节点,时间复杂度 O(n)。
ArrayList 通过索引直接访问,时间复杂度 O(1)。

内存占用与扩容

LinkedList 每个节点需额外存储前后指针,内存开销较大。
ArrayList 内存连续,但动态扩容时需拷贝数据到新数组(默认扩容 1.5 倍)。

适用场景

选择 ArrayList 的情况(绝大多数场景):
  • 频繁按索引访问元素get 和 set 操作)。

  • 大部分操作是在列表的末尾进行添加和删除(add(E element), remove(int index) 且 index 很大)。

  • 对内存空间敏感,希望占用更少的内存。

结论:由于在开发中查询的次数远大于增删,所以 ArrayList 是更常用的选择。

选择 LinkedList 的情况:
  • 需要频繁在列表的中间或开头进行插入和删除操作。

  • 需要将列表当作栈、队列或双端队列来使用(因为它实现了 Deque 接口)。

  • 不确定列表的大小,且非常频繁地进行动态增删,无法接受 ArrayList 扩容带来的性能损耗。

线程安全

两者均非线程安全,需通过 Collections.synchronizedList 或并发容器(如 CopyOnWriteArrayList)实现同步。

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

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

相关文章

7.4V锂电池充电芯片 内置快充协议 充电电流2A

XSP30是一款内置多种快充协议的2-4串锂离子电池升降压充电管理芯片,支持4.5V-15V电压输入,最大充电电流2A,采用异步开关架构,使其只需极少的成本实现锂电池快充功能,降低BOM成本。XSP30的开关频率为320KHz,转换效…

微信小程序获取上级页面地址和参数

var pages = getCurrentPages();console.log(pages);var curPages = pages[pages.length - 1].route;console.log(curPages);//获取上级页面pathvar prevPage = pages[pages.length - 2].route;console.log(prevPag…

2025年五大多层竹木地板厂商排行榜,精选竹木地板加工厂推荐

为帮企业高效锁定适配自身需求的竹木地板合作伙伴,避免选型走弯路,我们从工艺技术实力(如防腐防霉专利、结构稳定性)、定制服务能力(含异型加工、ODM/OEM灵活度)、全周期交付质量(覆盖生产到安装维护)及真实客…

2025年苏州正规西点培训学校推荐,西点培训服务哪家可靠全解

在烘焙行业蓬勃发展的当下,掌握专业西点技艺成为许多人的职业目标。然而,市场上西点培训学校鱼龙混杂,如何找到正规西点培训、确定西点培训服务哪家可靠,成为烘焙爱好者的核心痛点。以下结合教学实力、口碑评价与学…

三维设计师首选:Maya 2025 覆盖多领域,协同创作更高效 下载安装步骤

作为欧特克旗下专业三维工具,Maya 2025 聚焦建模、动画、特效、渲染核心功能升级,强化跨软件协作效率,覆盖电影特效、游戏开发、广告设计等场景,且原生适配 Intel/Apple Silicon 架构与 Windows 系统,满足专业创作…

2025年工业流体设备企业技术创新TOP5排名——上海易勒机

在工业4.0与智能制造浪潮下,流体处理设备的技术创新能力直接决定企业生产效率与产品竞争力。面对市场上同质化严重的设备供给,如何选择兼具技术实力、稳定性能与高效服务的供应商?以下基于技术创新度、产品性能、客…

20232402 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232402 2025-2026-1 《网络与系统攻防技术》实验八实验报告 1.实验内容 1.1 Web 前端 HTML 完成 Apache 服务的安装与启停操作,理解 HTML 表单及 GET、POST 提交方法的区别,并编写包含登录表单的 HTML 页面; 1.2 …

2025苏州西式餐饮教育机构TOP5权威测评:苏州欧米奇西点

随着西式餐饮行业的蓬勃发展,专业技能培训需求日益攀升。2024年数据显示,苏州西式餐饮培训市场规模同比增长30%,但35%的学员投诉集中在教学方法脱节、管理混乱、实践质量不达标三大问题。学员常遇坑:零基础学完难上…

在算法的深渊旁,绘制价值的星图:一位“门外汉”的AI元人文远征(2025.12.6)

在算法的深渊旁,绘制价值的星图:一位“门外汉”的AI元人文远征(2025.12.6) “从余溪诗学空间的悟空来路与关山,到现实悬鉴,摸索期间,主要是诗意现实,llm黑箱,更多的是自己确实不懂llm运行机制,一直在探索内外…

详细介绍:DomainNameSystem

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

RTOS 优先级翻转:原理剖析与 RT-Thread 实战验证

RTOS 优先级翻转:原理剖析与 RT-Thread 实战验证优先级翻转曾导致 1997 年火星探路者号(Mars Pathfinder)任务故障,是 RTOS 开发中必须掌握的经典问题。本文通过 RT-Thread 实验,彻底搞清楚它的原理和解决方案。 …

RTOS 优先级翻转:原理剖析与 RT-Thread 实战验证

RTOS 优先级翻转:原理剖析与 RT-Thread 实战验证优先级翻转曾导致 1997 年火星探路者号(Mars Pathfinder)任务故障,是 RTOS 开发中必须掌握的经典问题。本文通过 RT-Thread 实验,彻底搞清楚它的原理和解决方案。 …

三菱 FX5U 增加MC协议 modbus协议 【erwa.cn 二娃备忘】

三菱 FX5U 增加MC协议 modbus协议 重启PLC三菱 FX5U 增加MC协议 modbus协议 【erwa.cn 二娃备忘】

2025年度国产操作系统排行TOP5权威推荐:助力关键领域自

数字化时代,关键信息基础设施的自主可控成为国家战略重点,国产操作系统作为数字底座的核心价值愈发凸显。2024年信创产业报告显示,国产操作系统市场规模突破200亿元,年增速超60%,但企业选型常遇兼容性不足、数据安…

2025年五大知名靠谱食安管理系统服务商推荐,看哪家售后服务

在餐饮行业数字化转型浪潮中,后厨管理系统与食安管理系统已成为保障食品安全、提升运营效率的核心工具。面对市场上琳琅满目的服务商,如何挑选知名度高、售后完善且靠谱的系统?以下为您盘点2025年十大优质服务商,助…

NOI2018 归程 题解

link 题意 你有一个 \(n\) 个点 \(m\) 条边的无向图。每个边有边权。 \(q\) 次查询,给出出发点 \(u\) 和权值 \(k\),你可以先只经过边权 \(\gt k\) 的边到一个点 \(v\),然后从这个点到 \(1\),代价为你从 \(v\) 到 …

【LeetCode】106. 从中序与后序遍历序列构造二叉树 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机视觉与生成式AI及推理的集成技术

本文详细介绍了如何将生成式AI与推理模型集成到计算机视觉流程中,以实现更高效的视频内容理解与分析。内容涵盖知识图谱、边缘部署优化以及硬件支持扩展等核心技术架构。如何将计算机视觉流程与生成式AI及推理技术集成…

socket编程 - 详解

socket编程 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

2025年五大源头井式炉厂家推荐,井式炉实力供应商全解析

在工业热处理领域,井式炉作为周期式作业的核心设备,是杆类、长轴类零件热处理的关键工具,其性能直接影响工件精度与生产效率。面对市场上众多井式炉供应商,如何选择源头井式炉厂家与井式炉实力供应商?以下为你推荐…