arrays.copyof并非动态扩容,而是通过创建新数组、复制元素、手动赋值引用三步模拟扩容:新数组内存连续,但与原数组地址无关,原数组长度不可变。

Arrays.copyOf 不是数组的“动态重定义”,它只是创建一个新数组并复制内容,原数组完全不受影响。Java 中的数组长度在创建后就固定了,无法真正“重定义”或“动态扩容”——所谓动态,其实是用新数组替代旧引用的模拟行为。
Arrays.copyOf 是怎么模拟扩容的
它不改变原数组,而是:
- 根据指定的新长度,新建一个同类型数组
- 把原数组从索引 0 开始的元素复制过去(最多复制原数组全部元素)
- 若新长度更大,剩余位置自动填默认值(如
int填0,对象填null) - 最后返回这个新数组,需手动赋值给原变量才能“看起来像扩容”
例如:
int[] arr = {1, 2};
arr = Arrays.copyOf(arr, 4); // arr 现在指向新数组 {1, 2, 0, 0}
这里不是 arr 被重定义,而是 arr 这个引用被重新指向了一个更大的新数组。
动态重定义的常见误解
有人以为写 int[] arr = new int[5] 后还能再写 arr = new int[10] 就是“重定义”,其实这只是引用重新赋值:
- 第一次
new int[5]创建数组 A - 第二次
new int[10]创建数组 B -
arr丢弃对 A 的引用,改指 B - A 若无其他引用,将被垃圾回收
这和 copyOf 的逻辑本质一致:都是换引用,不是改原数组结构。
真正需要关注的要点
- 数组对象本身不可变长度,所有“扩容”操作都依赖新建+复制+重赋值
-
Arrays.copyOf封装了这一过程,比手写System.arraycopy更简洁,适合截取前 N 个或简单扩容 - 如果要保留原数组、或复制中间某段、或复制到已有目标数组中,就不能用
copyOf,得选copyOfRange或System.arraycopy
不复杂但容易忽略











