Arrays.copyOf 是 Java 中用于数组复制、扩容或截断的高效工具,底层封装 System.arraycopy,支持多种类型及类型转换,但为浅拷贝;适用扩容缩容场景,等长复制追求极致性能时应选 clone()。

Arrays.copyOf 是 Java 中最常用、最直观的数组复制工具之一,它能一键完成复制、扩容或截断,底层高效且语义清晰。
核心用法:只需源数组和目标长度
调用方式统一简洁,无需预先创建目标数组:
- 复制全部并保持原长:
int[] copy = Arrays.copyOf(src, src.length) - 扩容(多出位置自动填默认值):
int[] expanded = Arrays.copyOf(src, 8)→ 若 src 长为 5,则后 3 位为 0 - 截取前 N 个元素:
String[] head = Arrays.copyOf(names, 3)→ 只取索引 0~2 - 引用类型同理:扩容时多出位置填
null,如String[] arr3 = Arrays.copyOf(arr, 10)
支持多种类型,含类型转换重载
除基础类型(int[]、double[]等)外,还提供泛型版本与类型转换能力:
- 普通对象数组:
Integer[] copy = Arrays.copyOf(original, 5) - 跨类型转换(需显式指定目标类型):
Number[] nums = Arrays.copyOf(ints, 5, Number[].class) - 注意:转换不改变元素本身类型,仅适配数组容器;运行时若类型不兼容会抛
ArrayStoreException
内部实现:封装 System.arraycopy 的安全层
所有重载版本最终都走同一逻辑路径:
- 先按
newLength创建新数组(基本类型直接 new,引用类型通过Array.newInstance) - 再调用
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)) - 整个过程是浅拷贝——对对象数组只复制引用,不递归克隆对象内容
- 因此性能略低于裸用
System.arraycopy(多一次数组分配),但开发效率高、不易出错
适用场景与选型建议
不是所有复制都要用 copyOf,关键看需求:
- 需要“扩容/缩容 + 默认填充” → 选
Arrays.copyOf(如模拟 ArrayList 扩容) - 只复制等长数组,追求极致速度 → 用
clone()(arr.clone()最简最快) - 要复制中间一段、拼接数组、或复用已有目标数组 → 必须用
System.arraycopy - 仅需某段区间(如索引 2 到 6)→ 直接用
Arrays.copyOfRange(arr, 2, 6),更语义化


















