arrays.copyof 是 java 中最常用、最安全的数组拷贝方法之一,支持同类型复制、截断扩容及基本与引用类型处理,通过指定 newlength 自动填充默认值或截取元素,返回全新数组对象,且可配合 stream 实现包装类型转换。

Arrays.copyOf 是 Java 中最常用、最安全的数组拷贝方法之一,它不仅能复制同类型数组,还能在指定长度下自动处理截断或扩容,并支持基本类型与引用类型,是实现类型转换(如 int[] → Integer[])的关键桥梁。
一、Arrays.copyOf 的核心能力与参数解析
该方法定义在 java.util.Arrays 类中,重载版本丰富,最常用的是:
- T[] copyOf(T[] original, int newLength):用于引用类型(如 String[]、Integer[])
- int[] copyOf(int[] original, int newLength):对应每种基本类型都有专属重载(byte、short、long、float、double、boolean、char)
关键点:
- newLength 小于原数组长度时,结果被截断;大于时,新位置用默认值填充(0、false、null 等)
- 返回的是全新数组对象,与原数组内存无关,修改互不影响
- 不支持直接跨类型拷贝(如 int[] → String[]),但可配合装箱/拆箱或 Stream 实现转换
二、基本类型数组的快速复制与扩容
适用于性能敏感场景,如缓存扩容、日志缓冲区管理:
- 复制并扩容:
int[] bigger = Arrays.copyOf(data, data.length * 2);—— 后半部分自动填 0 - 复制并截取前 5 个元素:
int[] head = Arrays.copyOf(data, 5);—— 超出则忽略,不足则补 0 - 注意:对 byte[]、char[] 等也完全适用,且比 System.arraycopy() 更简洁、不易出错
三、基本类型 ↔ 包装类型数组的转换技巧
Arrays.copyOf 本身不支持跨类型,但可组合使用实现高效转换:
-
int[] → Integer[]:
Integer[] boxed = Arrays.stream(ints).boxed().toArray(Integer[]::new); -
Integer[] → int[]:
int[] unboxed = Arrays.stream(boxed).mapToInt(Integer::intValue).toArray(); - 若需保留 null 安全性(Integer[] 中含 null),应改用传统 for 循环或 Optional 处理,避免 NPE
小提示:JDK 16+ 可用 Arrays.toString() 或 Arrays.deepToString() 快速验证转换结果。
四、实战:动态构建配置数组并统一转为不可变副本
常见于初始化阶段将 List 配置转为数组,并确保后续不可修改:
- 从 List
构建固定长度数组: String[] config = Arrays.copyOf(list.toArray(new String[0]), 10); - 若 list.size() 10,则只取前 10 项
- 进一步封装为不可变视图(非真正不可变,但可防御性编程):
return Arrays.copyOf(config, config.length);返回副本,防止外部篡改原始数据
这种写法比手动 new + for 循环更简洁,也比 Collections.unmodifiableList 更贴合数组使用习惯。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











