arrays.copyof是java中最常用、高效的数组复制方法,底层调用system.arraycopy,支持扩容(自动填默认值)、截取(只取前n个)和等长复制,适用于动态扩容、安全返回副本及切片处理等场景。

Java 中数组拷贝不是简单地赋值引用,而是要真正复制元素内容。Arrays.copyOf 是最常用且高效的方式之一,尤其适合开发数据处理类组件时动态扩容、截取或初始化新数组。
Arrays.copyOf 的核心用法
它底层调用 System.arraycopy,性能接近原生操作,支持任意类型数组(包括基本类型和对象),且自动推断泛型类型。
- 拷贝全部元素:
int[] copy = Arrays.copyOf(original, original.length); - 扩容(长度大于原数组):多出位置用默认值填充(如 int 填 0,Object 填 null)
- 截取(长度小于原数组):只取前 N 个元素,超出部分丢弃
在数据处理组件中典型应用场景
比如写一个流式数据缓冲器,每次 add 后可能触发扩容;或实现分页工具,从原始结果集中提取某一页数据。
- 动态扩容:当缓冲区满时,用
Arrays.copyOf(buffer, buffer.length * 2)快速生成新缓冲区 - 安全返回副本:避免外部修改内部状态,如
public int[] getData() { return Arrays.copyOf(data, data.length); } - 切片处理:
String[] page = Arrays.copyOfRange(source, offset, Math.min(offset + size, source.length));更精准,但 copyOf 在已知起始为 0 时更简洁
注意边界与类型匹配
copyOf 不检查源数组是否为 null,传入 null 会直接抛 NullPointerException;也不校验索引越界——长度参数若为负数会立即报 IllegalArgumentException。
- 建议封装前加空校验:
if (arr == null) return new String[0]; - 基本类型数组与包装类型不能混用,
Arrays.copyOf(int[], length)返回 int[],不能赋给 Integer[] - 对象数组拷贝是浅拷贝,元素引用不变;如需深拷贝,得额外遍历并克隆每个对象
对比其他拷贝方式的取舍
比起手动 for 循环或 clone(),copyOf 更简洁安全;相比 ArrayList.toArray(),它不依赖集合结构,适合纯数组场景。
- 比循环快:JVM 对 System.arraycopy 有优化,尤其在大数据量时优势明显
- 比 clone() 灵活:支持指定新长度,而 clone() 只能等长复制
- 比 Stream.toArray() 轻量:无函数式开销,适合高频调用的数据管道组件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











