ArrayList查询快,因其底层基于连续内存的数组,支持下标直接访问,时间复杂度O(1);相比LinkedList需遍历指针且节点分散,它还具备缓存友好性和更少的对象引用开销。

ArrayList查询快,核心在于它底层用的是数组,支持通过下标直接访问元素,时间复杂度是 O(1)。
基于数组的连续内存存储
ArrayList内部封装了一个Object[]数组,元素在内存中是连续存放的。只要知道起始地址和每个元素大小,就能通过“首地址 + 下标 × 单个元素偏移量”一步算出目标元素位置,无需遍历。
- 比如 get(5),JVM直接定位到数组第6个槽位(索引从0开始),取值完成
- 对比LinkedList,得从头节点出发,逐个next跳转,查第5个要走5次指针,O(n)
缓存友好,CPU预取效率高
CPU访问内存时会预加载相邻数据块(cache line)。ArrayList元素紧挨着,一次预取可能覆盖后续几次get操作所需的数据,减少实际内存访问次数。
- 连续读取 get(0)、get(1)、get(2)……大概率命中CPU缓存
- 而LinkedList节点分散在堆内存各处,每次访问都可能是冷缓存,容易触发较慢的主存读取
无额外对象引用开销
ArrayList里存的是元素的引用(或基本类型包装后的引用),get操作只需解引用一次;LinkedList每个节点还要多一层Node对象封装,包含item、next、prev三个字段,访问item前得先拿到Node实例。
立即学习“Java免费学习笔记(深入)”;
- 少一次对象寻址,也减少GC压力(Node对象本身是额外分配的)
- 尤其在大量随机查询场景下,这个差异会被放大
基本上就这些——不是玄学优化,而是数组结构天然带来的定位能力+硬件层面的配合。当然,增删慢是它的另一面,但查得快这点,确实靠得住。











