数组适合频繁随机访问、修改少的场景,因内存连续可o(1)定位;链表适合频繁增删、数据量动态变化的场景,因节点可动态分配、插入删除仅需o(1)改指针。

选数组还是链表,关键看你的数据怎么用:如果查得多、改得少,优先数组;如果增删频繁、查得少,链表更合适。
查得快不快,取决于内存是不是连着
数组所有元素在内存里挨着坐,知道下标就能直接算出地址,查任意位置都是 O(1)。比如读第 100 个元素,不用路过前 99 个。链表每个节点散落在内存各处,查第 100 个得从头开始一个个跳指针,最坏要走 100 步,时间复杂度是 O(n)。所以,像缓存命中、矩阵运算、配置项读取这类“只读不改”或“按位置反复读”的场景,数组天然占优。
存得多不多,看要不要提前划地盘
数组创建时就得定好大小,比如 new int[1000] 就锁死 1000 个坑位。人少了空着浪费,人多了得整个新数组再搬过去——扩容有开销。链表不用预估,加一个节点就申请一块内存、连上指针,插入/删除头部或尾部都是 O(1)(LinkedList 是双向链表,头尾操作都不用遍历)。适合日志追加、会话动态管理、消息队列这类数据量起伏大、边界难预测的场景。
空间和速度之间常要折中
数组省空间:只存数据,没额外开销;链表多花内存:每个节点要带前后指针(64 位 JVM 下约 16 字节),10 万个元素就多占 1.6MB 左右。另外,CPU 缓存对连续内存更友好,数组遍历往往比链表快不少——哪怕逻辑步数一样,实际耗时可能差一倍。所以即使理论上链表插入快,但如果大部分操作是遍历+查,数组综合表现反而更稳。
别只看单点性能,要看整体模式
不是“链表插入快就全用链表”,得看真实操作组合:
- 频繁 按索引 get(i) + 偶尔 add/remove → 用 ArrayList(数组实现)
- 大量 addFirst()/removeLast() 或做栈/队列 → LinkedList 更贴切
- 既要随机访问,又要中间插入?考虑是否真需要——多数时候可重构逻辑,比如用 ArrayList + 标记删除,或引入跳表等进阶结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











