如何区分 ArrayList 与 LinkedList 的底层数据结构及各自的增删改查性能

轻晨吖_6778

轻晨吖_6778

2026-04-28

461人浏览

原创

arraylist 查询性能远优于 linkedlist:前者基于连续数组,支持 o(1) 索引访问且缓存友好;后者需遍历链表,平均 o(n),节点分散导致缓存失效。

如何区分 arraylist 与 linkedlist 的底层数据结构及各自的增删改查性能

ArrayList 和 LinkedList 虽然都实现 List 接口,但底层结构完全不同,直接决定了它们在增、删、改、查操作上的性能差异。

底层数据结构:数组 vs 双向链表

ArrayList 底层是动态扩容的 Object[] 数组,元素在内存中连续存储,支持通过索引直接定位。它内部维护 elementData 数组和 size 计数器,默认初始容量为 10,扩容时一般变为原容量的 1.5 倍。

LinkedList 底层是双向链表,每个节点(Node)包含三部分:数据项 item、前驱引用 prev、后继引用 next。头节点 first 和尾节点 last 保证 O(1) 的首尾操作,但所有节点在堆内存中分散存储,没有连续地址关系。

查询(get / set)性能:ArrayList 明显占优

ArrayList 支持随机访问,get(i) 直接计算内存偏移量,时间复杂度为 O(1);CPU 缓存友好,局部性原理生效。

LinkedList 的 get(i) 必须从 first 或 last 出发遍历,平均需走 n/2 步,时间复杂度为 O(n);且节点分散,无法利用 CPU 缓存预取。

  • 实测 10 万元素下:ArrayList 查询耗时通常
  • LinkedList 不实现 RandomAccess 接口,JDK 会据此优化遍历策略(如避免用普通 for 循环遍历)

插入与删除性能:位置决定优劣

尾部操作(add / remove last)两者都高效:

  • ArrayList 尾插均摊 O(1),仅扩容时触发 O(n) 数组复制
  • LinkedList 尾插始终 O(1),只需修改 last 指针

头部操作(addFirst / removeFirst)LinkedList 占绝对优势:

  • ArrayList 头插需整体右移所有元素,O(n)
  • LinkedList 头插仅新建节点并调整 first 和原首节点的 prev,O(1)

中间位置插入/删除(add(index) / remove(index))两者都是 O(n):

  • ArrayList 需移动后续元素
  • LinkedList 需先遍历到目标位置(O(n)),再修改指针(O(1))

内存占用与适用场景

ArrayList 内存更紧凑:只存数据,无额外指针开销;适合大数据量、频繁读取、尾部操作为主的场景(如日志缓存、分页列表)。

LinkedList 每个元素多占 16 字节(64 位 JVM 下两个对象引用),空间放大明显;适合小数据量、高频首尾增删、需模拟栈/队列/双端队列的场景(如任务调度缓冲区)。

实际开发中,90% 以上列表场景首选 ArrayList —— 因为随机访问更常见,而首部插入在业务逻辑中极少出现,且其内存与缓存优势在现代硬件上收益显著。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.01

2261

7

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

2025.12.22

336

20

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

2026.01.06

357

22

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

2026.05.09

412

25

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

0

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

0

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习