Arrays.copyOf 是 Java 中最实用的数组容量管理工具,它将创建新数组、复制内容、填充默认值三步压缩为一行代码,支持扩容(多出位置填默认值)、缩容或截断,本质是按需重建数组容器。

Arrays.copyOf 是 Java 中最实用的数组容量管理工具,它把“创建新数组 + 复制内容 + 填充默认值”三步操作压缩成一行代码,适合封装成可复用的扩容、缩容或截断接口。
Arrays.copyOf 的核心能力
它不只是复制,本质是按需重建数组容器:
- 长度不变 → 等效深拷贝(对基本类型)或浅拷贝(对引用类型)
- newLength > 原长度 → 自动扩容,多出位置填默认值(int 为 0,String 为 null,boolean 为 false)
- newLength
- 支持泛型推导,返回类型与原数组一致,无需强制转型
封装一个通用扩容方法
模拟 ArrayList.ensureCapacity 的逻辑,可写成简洁的工具方法:
// 支持任意引用类型数组的动态扩容
立即学习“Java免费学习笔记(深入)”;
public static <T> T[] ensureCapacity(T[] arr, int minCapacity) {
if (arr == null) return (T[]) new Object[minCapacity];
if (minCapacity <= arr.length) return arr;
return Arrays.copyOf(arr, minCapacity);
}
调用示例:
String[] names = {"Alice", "Bob"};names = ensureCapacity(names, 5); // → ["Alice", "Bob", null, null, null]
结合 copyOfRange 实现灵活切片
当需要从原数组中提取一段并独立成新容器时,搭配使用更清晰:
int[] data = {10, 20, 30, 40, 50};int[] slice = Arrays.copyOfRange(data, 1, 4); // → [20, 30, 40],左闭右开- 若需扩容后再切片,可链式调用:
Arrays.copyOfRange(Arrays.copyOf(src, 10), 2, 7)
注意浅拷贝带来的对象共享风险
对对象数组(如 Person[]),copyOf 只复制引用,不复制对象本身:
- 修改新数组中某个元素的属性,原数组对应位置的对象也会被改
- 如需真正隔离,必须手动深拷贝每个对象,或使用序列化、第三方库(如 Apache Commons Lang 的 SerializationUtils.clone)
- 基本类型数组(int[]、double[]等)无此问题,值已完全分离


















