Arrays.copyOf() 不直接动态扩容,而是创建新数组并复制内容:新长度大于原长则补默认值,小于等于则截断;底层调用 System.arraycopy(),高效安全;手动扩容需更新引用,如 original = Arrays.copyOf(original, newLength)。

Arrays.copyOf() 本身不直接“动态扩容”,但它是最常用、最简洁的实现手动扩容的核心工具——本质是创建一个新数组,并把原数组内容复制过去。
理解 copyOf 的作用
它不是修改原数组,而是返回一个指定长度的新数组:
- 如果新长度 > 原数组长度,多出的位置自动填入默认值(0、null、false 等)
- 如果新长度 ≤ 原数组长度,只复制前 N 个元素(相当于截断)
- 底层调用的是 System.arraycopy(),效率高且安全
手动扩容的标准写法
以 int 数组为例,扩容为原来的 1.5 倍(常见策略):
int[] original = {1, 2, 3};
int newLength = (int) (original.length * 1.5);
int[] expanded = Arrays.copyOf(original, newLength); // → {1, 2, 3, 0, 0}
之后你需要主动把 expanded 赋值回原引用,才能“生效”:
original = expanded; // 关键:更新引用
封装成可复用的扩容方法
避免每次重复计算,可以写一个通用方法:
public static int[] grow(int[] arr, int minCapacity) {
if (minCapacity <= arr.length) return arr;
return Arrays.copyOf(arr, minCapacity);
}
<p>// 使用示例
int[] data = {10, 20};
data = grow(data, 5); // 扩容到长度 5 → {10, 20, 0, 0, 0}
类似地,可为 String[]、Object[] 等提供重载或泛型版本(需配合 Arrays.copyOf(T[], int))。
注意事项和常见误区
扩容不是“自动”的,必须显式赋值引用;否则原变量仍指向旧数组:
- ❌ 错误:
Arrays.copyOf(arr, 10);—— 返回值没接收,原 arr 不变 - ✅ 正确:
arr = Arrays.copyOf(arr, 10); - 扩容后记得在逻辑中更新“有效元素个数”(比如用 size 变量记录,而非总 length)
- 频繁扩容建议用 ArrayList —— 它内部就是靠 Arrays.copyOf 实现 grow() 的

















