Arrays.copyOf 的核心是根据 newLength 控制行为:等于原长则完整复制,小于则截取,大于则填充默认值;底层封装 System.arraycopy,先创建新数组再拷贝,支持浅拷贝、自动初始化与严格边界校验。

Arrays.copyOf 是 Java 中用于快速复制数组(并可同时截取或扩容)的工具方法,底层直接调用 System.arraycopy,高效且安全,无需手动遍历。
核心作用:复制 + 长度控制
它不只是“复制”,而是根据指定新长度 newLength 决定行为:
- 若
newLength == 原数组长度→ 完整复制(等价于 clone) - 若
newLength < 原数组长度→ 截取前newLength个元素(丢弃尾部) - 若
newLength > 原数组长度→ 复制全部元素,剩余位置用默认值填充(如 int 为 0,Object 为 null)
基本用法与类型推断
方法签名是泛型的,编译器能自动推导类型,写法简洁:
int[] a = {1, 2, 3, 4, 5};
int[] b = Arrays.copyOf(a, 3); // → {1, 2, 3}
int[] c = Arrays.copyOf(a, 7); // → {1, 2, 3, 4, 5, 0, 0}
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
对引用类型同样适用,新数组元素是原数组的**浅拷贝**(对象引用被复制,不创建新对象)。
底层其实是 System.arraycopy
copyOf 并非循环实现,而是封装了本地方法 System.arraycopy:
- 先用
new创建目标数组(按newLength) - 再调用
System.arraycopy(src, 0, dest, 0, Math.min(src.length, newLength)) - 如果
newLength > src.length,后续未复制的位置由 JVM 自动初始化为默认值
因此性能接近原生数组操作,远优于手写 for 循环。
注意 null 和边界情况
传入 null 会直接抛 NullPointerException;newLength 为负数则抛 NegativeArraySizeException。它不做空检查,使用前需自行校验。
如果需要容错复制(比如允许 null),应额外判断,例如:
int[] safeCopy = (arr == null) ? new int[0] : Arrays.copyOf(arr, len);

















