Arrays.copyOf 通过泛型和重载支持所有数组类型,底层统一调用 System.arraycopy 实现高效浅拷贝;基本类型用对应重载,引用类型用泛型版本,返回正确类型数组,扩容自动填默认值,null 源数组抛 NPE。

Arrays.copyOf 可以拷贝任意引用类型或基本类型的数组,它本身不依赖具体类型,靠泛型和重载实现多态支持,实际拷贝过程与数据类型无关,只取决于传入的源数组和目标长度。
支持所有数组类型,无需手动区分
Arrays.copyOf 提供了针对每种基本类型(如 int、double、boolean)的重载方法,也提供了一个泛型版本用于引用类型。JVM 根据实参类型自动选择对应方法,开发者不用写 if 判断或类型转换。
- 基本类型数组:直接调用对应重载,例如 Arrays.copyOf(int[], int)
- 引用类型数组:使用泛型方法 Arrays.copyOf(T[], int),编译器推断类型,运行时保留组件类型
- 注意:泛型版本返回的是 T[],不是 Object[],避免强制转型
拷贝逻辑统一:底层调用 System.arraycopy
所有重载版本最终都委托给 native 方法 System.arraycopy,保证高效且语义一致:浅拷贝、连续内存复制、越界检查由 JVM 保障。
- 新数组长度若大于原数组,多余位置按类型默认值填充(如 int 填 0,引用类型填 null)
- 若小于原数组,只复制前 N 个元素,不抛异常
- 源数组为 null 时会抛 NullPointerException,需自行判空
实战中避开常见陷阱
看似简单的方法,容易在类型擦除、泛型边界和子类数组处理上出错。
立即学习“Java免费学习笔记(深入)”;
- 不要用 Object[] 接收子类数组再拷贝——会丢失运行时类型信息,改用泛型方法直接操作原始数组
- 拷贝 String[]、Integer[] 等不可变类型没问题;但拷贝自定义对象数组时,只是复制引用,对象本身未深拷贝
- 若需扩容并保留原有内容,直接用 Arrays.copyOf(arr, arr.length + 10),比先创建再 System.arraycopy 更简洁
结合泛型工具方法提升复用性
可封装一层适配不同场景,比如带默认值填充或安全判空。
- 示例:安全拷贝方法 public static <T> T[] safeCopy(T[] src, int newLength) { return src == null ? (T[]) new Object[newLength] : Arrays.copyOf(src, newLength); }
- 对基本类型,仍建议直接用原生重载,避免装箱/拆箱开销
- 泛型方法中不能直接 new T[newLength](类型擦除),必须通过反射或借用 Object[] 转型,Arrays.copyOf 内部正是这样处理的


















