arraylist随机访问高效因底层用数组实现,o(1)时间复杂度;扩容通过复制数组动态调整大小,缩容需手动调用trimtosize(),clear()不缩容。

Java 中的 ArrayList 能高效随机访问,是因为它底层用数组实现;而扩容缩容则通过动态调整内部数组大小来完成,整个过程对用户透明,但理解其机制有助于写出更高效的代码。
随机访问:靠数组下标,O(1) 时间复杂度
ArrayList 内部维护一个 Object[] elementData 数组,所有元素按插入顺序连续存储。随机访问(如 get(int index))直接通过数组下标定位,无需遍历:
- 先检查索引是否越界(
index >= size || index ),抛出 <code>IndexOutOfBoundsException - 若合法,则直接返回
elementData[index]
这种基于连续内存+下标计算的方式,使得访问任意位置元素都是常数时间,和链表的 O(n) 形成鲜明对比。
扩容:添加元素时自动增长,1.5 倍策略
当调用 add(E e) 且当前容量不足(size == elementData.length)时,会触发扩容:
- 新容量 = 旧容量 × 1.5(即
oldCapacity + (oldCapacity >> 1)) - 使用
Arrays.copyOf()创建新数组,并将原数组内容复制过去 - 新元素追加到新数组末尾,
size加 1
例如:初始容量为 10,满后扩容为 15;再满扩为 22(15+7),依此类推。该策略在空间利用率与复制开销间做了平衡。
缩容:不自动发生,需手动调用 trimToSize()
ArrayList 默认不会因删除元素而自动缩小底层数组——这是为了防止频繁增删导致反复拷贝,影响性能。
- 删除操作(如
remove())只减少size,不改变elementData.length - 如果确认后续不再添加大量元素,可调用
trimToSize(),将数组大小精确收缩到当前size - 也可用
ensureCapacity(int minCapacity)预留空间,避免多次扩容
注意:clear() 方法清空元素但不缩容,数组长度保持不变。
小结:设计取舍清晰,用好关键方法更高效
随机访问快,得益于数组本质;扩容有策略、缩容需主动——这反映了 ArrayList “以空间换时间、兼顾常见场景”的设计哲学。日常开发中,预估容量(构造时指定)、避免无谓缩容、理解 get/set 的零成本,能让集合操作更可控、更高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











