Arrays.copyOf 是 Java 中兼顾可读性与功能性的数组拷贝方法,自动建数组、安全扩容、类型推导三合一;适用于全量复制、容量调整及默认值填充场景。

Arrays.copyOf 是 Java 中最常用、最平衡的数组拷贝方式——它不追求极致性能,也不牺牲可读性,而是把“自动建数组 + 安全扩容 + 类型推导”三件事一次做完。日常开发中,90% 的完整复制或扩容需求,用它就够了。
什么时候该用 Arrays.copyOf
核心判断标准:你要的是整个数组的副本,或者想扩大/缩小它的容量,且不关心底层偏移细节。
- 备份当前状态(如算法中间结果、配置快照)
- 模拟动态数组扩容(比如手动实现简易 ArrayList)
- 统一初始化新数组并填入旧数据(避免先 new 再循环赋值)
- 需要按类型自动填充默认值(int[] 补 0,String[] 补 null)
怎么用才不出错
记住三个关键行为,比死记语法更重要:
- 长度决定行为:newLength 小于原长 → 截断;等于原长 → 全量复制;大于原长 → 扩容+补默认值
-
类型安全返回:编译器能自动推导泛型,无需强制转型(
String[] copy = Arrays.copyOf(src, 10)合法) - 永远浅拷贝:对对象数组,只复制引用。若对象本身可变,修改新数组里的元素仍会影响原对象
和其它方法对比着用
别把它当万能钥匙,清楚它不擅长什么:
立即学习“Java免费学习笔记(深入)”;
- 要拷某一段(比如第 5–8 个元素)→ 改用
Arrays.copyOfRange(arr, 5, 9) - 目标数组已存在,只想覆盖其中一块 → 用
System.arraycopy(src, 2, dest, 3, 4) - 只是快速全量备份,代码越短越好 →
arr.clone()更简洁(但不能扩容) - 大数据量高频拷贝(如网络缓冲区)→ 复用目标数组 +
System.arraycopy减少 GC 压力
一个实用扩容模板
模拟 ArrayList.ensureCapacity 的轻量写法:
public static <T> T[] ensureCapacity(T[] arr, int minCapacity) {
if (arr == null) return (T[]) new Object[minCapacity];
if (arr.length >= minCapacity) return arr;
return Arrays.copyOf(arr, minCapacity);
}
调用时直接 data = ensureCapacity(data, 100); —— 安全、无副作用、语义清晰。


















