arrays.copyof 是 java 中安全高效的数组拷贝工具,支持截断、扩容与默认值填充,自动处理类型兼容性,但需注意 null 校验、负长度异常及多线程可见性问题。

Java 中数组长度固定,但业务中常需“扩容”或“截断”,Arrays.copyOf 是最直接、安全的拷贝工具——它自动处理 null、越界和类型兼容性,比手动循环或 System.arraycopy 更简洁可靠。
一、copyOf 的核心用法与参数含义
Arrays.copyOf(T[] original, int newLength) 创建新数组并复制元素。关键点:
- newLength :只取前
newLength个元素(截断) -
newLength > original.length:复制全部原元素,剩余位置用默认值填充(如
0、null、false) -
original 为 null:抛出
NullPointerException,需提前校验 - 返回的是新数组对象,原数组不受影响
二、模拟动态数组扩容的经典场景
例如实现简易 ArrayList 的 add 方法:
当内部数组满时,按 1.5 倍扩容:
private int size = 0;
private String[] elements = new String[2];
<p>public void add(String item) {
if (size == elements.length) {
elements = Arrays.copyOf(elements, (int) (elements.length * 1.5));
}
elements[size++] = item;
}</p>
对比手动 new + for 循环,copyOf 一行完成扩容+复制,代码更短、不易出错。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
三、配合泛型与基本类型的安全使用
copyOf 有多个重载方法,编译器会自动选择:
-
copyOf(int[], int)→ 返回int[] -
copyOf(String[], int)→ 返回String[] -
copyOf(Object[], int, Class<t>)</t>→ 用于泛型擦除后明确类型,如:Arrays.copyOf(strings, 5, String[].class)
注意:不能用 copyOf 将 int[] 直接转成 Integer[],这是装箱问题,需额外遍历处理。
四、常见误区与避坑提醒
以下操作容易引发问题:
-
误以为 copyOf 支持负数 newLength:会抛
NegativeArraySizeException -
忽略原数组为 null:应先判空,或用
Objects.requireNonNull - 混淆 copyOf 和 copyOfRange:后者支持指定起止索引,适合子数组提取
-
在多线程中直接替换引用却未同步:若
elements是共享字段,扩容赋值需保证可见性(如用 volatile 或加锁)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










