Java面试题更新 2026-08-05

在 Java 中,ArrayList 内部是如何实现动态扩容的?请描述其触发条件、扩容步骤以及新旧容量之间的关系。

性能优化技术原理Java

考察说明

考查对 Java 集合框架中 ArrayList 动态扩容机制的掌握程度。

回答思路

  1. 【回答框架 1】ArrayList 基于 Object 数组实现,默认初始容量为 10。当调用 add 方法且当前元素数量等于数组长度时,触发扩容。
  2. 【回答框架 2】扩容时,新容量为旧容量的 1.5 倍,即 oldCapacity + (oldCapacity >> 1)。如果新容量仍小于所需最小容量,则使用所需最小容量。
  3. 【回答框架 3】扩容通过 Arrays.copyOf 方法将原数组元素复制到新数组中,这个过程是 O(n) 的,频繁扩容会影响性能。
  4. 【回答框架 4】可以通过构造函数指定初始容量,或在添加大量元素前使用 ensureCapacity 方法预分配容量,以减少扩容次数。
  5. 【回答框架 5】扩容只保证容纳新元素,不保证元素顺序变化,因为复制是整体拷贝,顺序保持不变。
  6. 【关键点 1】默认初始容量为 10,扩容因子为 1.5。
  7. 【关键点 2】扩容触发条件是 add 时 size == elementData.length。
  8. 【关键点 3】使用 Arrays.copyOf 复制数组,时间复杂度 O(n)。
  9. 【易错点 1】误以为扩容会翻倍,实际是 1.5 倍。
  10. 【易错点 2】忽略扩容对性能的影响,在循环中添加大量元素时未预分配容量。