arrays.copyof 本质是创建新数组并复制原内容,返回扩容后的新引用而非修改原数组;新长度大于原长时末尾补默认值,小于则截断,原数组不变。

Java 中数组本身不可变长,但 Arrays.copyOf 提供了一种简洁、安全的“扩容”方式——本质是创建新数组并复制原内容。它不是真正修改原数组,而是返回扩容后的新引用,这点必须明确。
理解 copyOf 的核心行为
Arrays.copyOf(T[] original, int newLength) 会创建一个指定长度的新数组,将原数组元素从索引 0 开始逐个复制过去。若新长度大于原数组长度,多出的位置自动用默认值填充(如 int 填 0,引用类型填 null);若新长度更小,则只复制前 newLength 个元素,相当于截断。
- 原数组不受影响,仍是原来的对象
- 返回的是全新数组,需手动赋值给变量才能“生效”
- 底层调用
System.arraycopy,性能高效,比手写循环更可靠
常见扩容场景与写法
实际开发中,常用于模拟动态数组逻辑(比如替代 ArrayList 的简单场景)或临时扩大缓冲区。
-
基础扩容:从长度 3 扩到 5
int[] arr = {1, 2, 3};
arr = Arrays.copyOf(arr, 5); // arr 现在是 [1, 2, 3, 0, 0] -
扩容并追加元素:先扩容,再赋值新元素
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = 99; // 最后一位设为 99 -
避免空指针:对 null 数组调用会抛
NullPointerException,建议判空
if (arr != null) {
arr = Arrays.copyOf(arr, newLen);
} else {
arr = new int[newLen];
}
对比其他扩容方式的优劣
相比手动新建数组+循环复制,copyOf 更简短且不易出错;相比 ArrayList,它轻量无封装开销,但不提供 add/remove 等方法,也不自动管理容量。
- ✅ 语义清晰、代码少、JDK 内部优化过
- ❌ 不支持泛型推导(如
copyOf(arr, len)无法自动识别 T 类型,需显式类型参数或依赖上下文) - ❌ 频繁调用仍会产生大量中间数组,不适合高频增删场景
实用技巧与注意事项
真正用好 copyOf,关键在时机和边界控制。
- 扩容倍数建议按 1.5 倍或 2 倍增长,减少频繁复制(例如:newLen = Math.max(original.length + 1, original.length * 2))
- 复制时注意类型匹配:原始数组是
String[],就别传Integer[],否则编译不过 - 多维数组不能直接用
copyOf深拷贝,它只复制第一层引用,内部数组仍共享 - 如果只是临时需要更大空间(如排序前预分配),可直接
copyOf,无需反复赋值回原变量
不复杂但容易忽略细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











