ArrayList随机访问快因底层为数组,get(int index)直接通过下标计算内存偏移,时间复杂度O(1),不遍历、不查表、不跳指针。

ArrayList的随机访问为什么快
因为底层用的是数组,get(int index) 直接通过下标计算内存偏移,时间复杂度是 O(1)。只要不越界,它不遍历、不查表、不跳指针。
但要注意:如果在循环里反复调用 get(i) 做条件判断(比如找某个值),JVM 一般能内联优化;可一旦混入装箱操作(如 list.get(i) == 42 对 Integer),就可能触发自动拆箱 + 空指针检查,反而拖慢速度。
- 避免在
for循环中对ArrayList写if (list.get(i) == x),改用增强for或预存引用 - 如果确定不会修改结构,可考虑用原始类型集合库(如
fastutil的IntArrayList)绕过泛型擦除和装箱开销 -
size()调用几乎无成本(只是返回一个字段),不必缓存到局部变量,除非你在 HotSpot 外的 JVM 上跑
add() 在末尾和中间的代价差异极大
在末尾追加元素(add(E e))平均是 O(1),但有扩容成本;插入到中间(add(int index, E element))则是 O(n) —— 因为要移动后续所有元素。
常见误用场景:一边遍历一边用 add(index, e) 插入,结果变成 O(n²),尤其在大数据量时卡顿明显。
立即学习“Java免费学习笔记(深入)”;
产品介绍微趣能 Weiqn 开源免费的微信公共账号接口系统。MVC框架框架结构清晰、易维护、模块化、扩展性好,性能稳定强大核心-梦有多大核心就有多大,轻松应对各种场景!微趣能系统 以关键字应答为中心 与内容素材库 文本 如图片 语音 视频和应用各类信息整体汇集并且与第三方应用完美结合,强大的前后台管理;人性化的界面设计。开放API接口-灵活多动的API,万名开发者召集中。Weiqn 系统开发者AP
- 批量插入优先用
addAll(),它内部会一次性复制数组,比逐个add()少多次扩容和位移 - 如果必须频繁在头部/中间插入,
ArrayList不合适,换LinkedList(但注意它的get()是O(n))或ArrayDeque(仅限头尾) - 扩容阈值由
grow()控制,默认增长 50%(oldCapacity + (oldCapacity >> 1)),所以初始容量设太小会导致多次复制;预估大小后用new ArrayList(initialCapacity)
迭代器遍历时 remove() 的陷阱
直接用 list.remove(obj) 或 list.remove(index) 在遍历时会引发 ConcurrentModificationException,这不是线程安全问题,而是 modCount 检测到结构性修改。
正确做法是用迭代器自己的 remove() 方法,它会同步更新 expectedModCount。
Iteratorit = list.iterator(); while (it.hasNext()) { String s = it.next(); if (s.startsWith("tmp")) { it.remove(); // ✅ 安全 } }
- 别用
for-each循环配合list.remove(),编译器生成的字节码仍是隐式迭代器,同样抛异常 -
removeIf(Predicate)是 Java 8+ 推荐方式,内部也走迭代器逻辑,语义清晰且 JIT 可能优化 - 如果删除条件复杂、涉及多个字段,先收集待删索引再倒序
remove(int index),避免索引偏移
ArrayList不是线程安全的,但synchronized包装有代价
Collections.synchronizedList(new ArrayList()) 只是对每个方法加了 synchronized(this),读写都串行化。高并发下吞吐骤降,且无法保证复合操作原子性(比如 if (!list.contains(x)) list.add(x) 仍需额外同步块)。
- 若只读多、写少,用
CopyOnWriteArrayList,但注意每次写操作都会复制整个数组,内存和 GC 压力大 - 若需高频读写+简单操作,考虑
java.util.concurrent.ConcurrentLinkedQueue替代(虽不是List,但支持add()/poll()等无锁操作) - 真正需要
List语义又要求并发安全时,往往说明设计有问题——比如是否该用Map或分片结构替代单一大列表
ArrayList 当作“万能容器”盲目使用,而不看访问模式。查得多?选它。插删频繁?换结构。数据量上百万还用 indexOf() 扫描?那不是性能问题,是算法选择错误。










