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

深度对比 ArrayList 与 LinkedList:从底层数据结构到增删查改的性能差异实测

深度对比 ArrayList 与 LinkedList

从底层数据结构到增删查改的性能差异分析如下:

1. 底层数据结构
  • ArrayList
    基于动态数组实现,内存空间连续。
    扩容机制:当容量不足时,新建一个更大的数组(通常扩容1.5倍),并复制原数据。
    公式:扩容后容量 $C_{\text{new}} = \lfloor C_{\text{old}} \times 1.5 \rfloor$

  • LinkedList
    基于双向链表实现,节点结构:

    class Node {E item;Node prev; // 前驱节点Node next; // 后继节点
    }
    

    内存空间不连续,每个节点独立分配内存。


2. 时间复杂度对比
操作ArrayListLinkedList
随机访问$O(1)$$O(n)$
头部插入$O(n)$$O(1)$
尾部插入$O(1)$ (分摊)$O(1)$
中间插入$O(n)$$O(n)$ (需遍历)
删除元素$O(n)$$O(1)$ (已知位置)

说明

  • ArrayList 尾部插入在未扩容时为 $O(1)$,扩容时为 $O(n)$(分摊后仍为 $O(1)$)。
  • LinkedList 删除操作需已知节点位置(如通过迭代器),否则查找位置需 $O(n)$。

3. 性能实测关键场景

通过以下测试方案可验证性能差异(单位:纳秒/操作):

// 测试代码框架示例
public void testPerformance() {List<Integer> arrayList = new ArrayList<>();List<Integer> linkedList = new LinkedList<>();// 测试1:尾部插入 (100万次)measureTime(() -> {for (int i = 0; i < 1_000_000; i++) list.add(i);});// 测试2:随机访问 (10万次索引)measureTime(() -> {for (int i = 0; i < 100_000; i++) list.get(randIndex);});// 测试3:头部删除 (1万次)measureTime(() -> {for (int i = 0; i < 10_000; i++) list.remove(0);});
}

预期结果

  • 尾部插入:ArrayList ≈ LinkedList(因LinkedList需频繁分配节点内存)
  • 随机访问:ArrayList 比 LinkedList 快 $100\times$ 以上(数组直接寻址 vs 链表遍历)
  • 头部删除:LinkedList 比 ArrayList 快 $1000\times$(链表修改指针 vs 数组整体移位)

4. 底层机制对性能的影响
  • 内存局部性
    ArrayList 数据连续存储,CPU 缓存命中率高;LinkedList 数据分散,缓存频繁失效。
  • 内存开销
    ArrayList 仅需存储数据和容量指针;LinkedList 每个节点额外占用 2 个引用空间(prev/next)。
  • GC 压力
    LinkedList 频繁增删时产生大量节点对象,增加垃圾回收负担。

5. 应用场景推荐
场景推荐选择原因
高频随机访问ArrayList$O(1)$ 访问效率
频繁头部增删LinkedList$O(1)$ 增删
内存敏感场景ArrayList连续存储减少内存碎片
大数据量尾部插入ArrayList分摊 $O(1)$ 优于链表分配

总结

  • 90% 以上场景优先选 ArrayList(综合性能最优)。
  • 仅需频繁在 已知位置增删 时(如实现队列),选用 LinkedList。
http://www.dtcms.com/a/553356.html

相关文章:

  • 信任的重构:S11e Protocol 如何以算法取代中介
  • Python 第二十五节 常用练习问题(三)
  • Spring AI Alibaba 【五】
  • 什么网站是用html做的2023年时政热点事件
  • 泉州企业免费建站制作网站首页
  • 2025年10月31日全球AI前沿动态
  • Linux线程同步(四)
  • 全新升级!山海鲸4.6.3版本正式亮相
  • 图像压缩-将8bit数据压缩为2bit
  • 海宁网站怎么做seo企业网站能起到什么作用
  • 手机在网上怎么创建自己的网站网站开发人员职位
  • LineSlam线特征投影融合(Fuse) 中pML->GetLineNormalVector()的理解代码理解
  • 【图像处理基石】多波段图像融合算法入门:从概念到实践
  • Docker核心文件:DockerCompose文件
  • 企业网站 自助建站网站做竞价经常会被攻击吗
  • Android ble理解
  • 深入理解 Spring Boot Web 开发中的静态资源处理机制
  • 网站建设费记什么科目产品ui设计是什么
  • 衡水企业网站设计国内app开发公司
  • 【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项
  • 如何保证缓存与数据库更新时候的一致性
  • 【Spring Boot Starter 设计思考:分离模式是否适用于所有场景】
  • HTTP 头部参数数据注入测试sqlilabs less 18
  • 网站速度慢的原因做网站建设优化的电话话术
  • 【数据结构】单链表 练习记录
  • mac 安装 jdk17
  • 【项目实战1-瑞吉外卖|day22】
  • 怎么用dw做响应式网站网站主持人制作网站代言人
  • Android开发自学笔记 --- Kotlin
  • 从VB到PyCharm:编程工具跨越时代的传承与革命