arrays.copyof 是 java 中推荐的数组拷贝方式,底层调用 system.arraycopy,支持动态扩容、自动补默认值,并需重新赋值引用;区别于 clone()(不可扩容)和 system.arraycopy(需手动创建数组)。

Arrays.copyOf 是 Java 中最常用、最直接的数组拷贝方式,它底层调用 System.arraycopy,性能高效且语义清晰。它不光能复制原数组,还能在复制的同时改变长度——这是实现“动态扩容”的核心能力。
扩容原理:用 copyOf 拉伸数组边界
数组本身不可变长,但我们可以创建一个新数组,把旧数据搬进去,并预留额外空间。copyOf 正是干这事的:
- 传入原数组和目标长度,自动创建新数组并拷贝前 min(原长, 新长) 个元素
- 若新长度 > 原长度,多出位置补默认值(0、null、false)
- 若新长度
典型扩容场景:模拟 ArrayList 的 grow 逻辑
比如实现一个简易整数容器,当容量不足时扩容 1.5 倍:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int[] data = {1, 2, 3};
int size = 3;
// 需要插入第 4 个元素,但当前满员
if (size >= data.length) {
int newCapacity = data.length + (data.length >> 1); // ×1.5
data = Arrays.copyOf(data, newCapacity);
}
data[size++] = 4;
注意:copyOf 返回的是新数组引用,必须重新赋值给原变量,否则扩容无效。
类型安全与泛型数组的注意事项
copyOf 有多个重载方法,分别对应基本类型和 Object:
-
copyOf(int[], int)→ 返回int[] -
copyOf(Object[], int)→ 返回Object[] - 泛型数组不能直接用 copyOf(T[], int),需用
copyOf(T[], int, Class<t>)</t>指定运行时类型,避免类型擦除导致的 ClassCastException
和 clone()、System.arraycopy 的关键区别
别混淆三者用途:
-
clone():浅拷贝,长度固定,不能扩容;对基本类型数组可用,但对多维数组需手动递归 -
System.arraycopy:底层高效,但需手动新建数组、指定起始偏移和长度,易出错 -
Arrays.copyOf:封装了 arraycopy,自动处理新数组创建和长度适配,语义明确,推荐日常使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










