ArrayList和LinkedList内部的实现原理和区别 📅 2026/7/7 15:35:08 一、内部实现原理ArrayList它的底层基于动态扩容的Object数组实现内存是连续分布的无参构造初始化时默认是空数组第一次添加元素才会将容量初始化为10当数组容量不足时会自动扩容为原容量的1.5倍通过创建新数组、批量拷贝旧元素完成扩容依托数组的下标索引特性天然支持O(1)时间复杂度的随机访问LinkedList它的底层基于双向链表实现JDK1.6之后废弃了旧版本的双向循环链表内存不需要连续分布内部定义了独立的Node节点类每个节点同时存储元素数据、指向前驱节点的prev指针、指向后继节点的next指针没有数组扩容机制新增/删除元素时仅需要修改相邻节点的指针指向不需要批量移动数据不支持直接通过下标定位元素访问指定位置元素时需要从头部或尾部开始遍历链表查找二、核心区别对比访问性能ArrayList通过数组下标直接定位元素查询、修改操作的时间复杂度为O(1)LinkedList必须遍历链表才能找到目标元素随机访问的时间复杂度为O(n)性能远低于ArrayList。增删性能ArrayList在数组中间插入/删除元素时需要移动后续所有元素来维持数组连续性大数据量下性能开销很高LinkedList在已知目标位置的前提下仅需修改前后节点的指针即可完成增删操作效率更高。注意如果是在列表尾部追加元素两者性能几乎没有明显差异。内存占用ArrayList的内存结构紧凑仅会因扩容预留少量冗余容量没有额外的额外开销LinkedList的每个节点都需要额外存储两个指针同等数据量下占用的内存远高于ArrayList。线程安全两者都没有做同步锁控制都是非线程安全的集合多线程并发读写场景下容易出现数据覆盖、数组越界等异常。三、适配场景优先选择ArrayList的场景90%以上的常规业务场景都推荐使用它尤其是以高频随机查询为主、增删操作大多集中在列表尾部的场景比如业务数据分页返回、常规列表数据遍历处理它的查询性能和内存利用率都更有优势。如果提前预知数据量大小还可以手动指定初始容量避免频繁扩容带来的性能损耗。选择LinkedList的场景仅适合需要频繁在列表头部、中间位置执行插入/删除操作的场景比如实现FIFO队列、栈结构或者需要频繁在列表中间动态插入元素的算法场景这类场景下LinkedList的增删效率优势才能充分体现。