【Java】复制数组的四种方式

1. System.arraycopy()

用来将一个数组的(一部分)内容复制到另一个数组里面去。

定义:

java 复制代码
void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

例:

java 复制代码
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = new int[10];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

如果传入的参数为 null、传入的参数不是数组、无法将原数组的类型转换为目标数组的类型、目标数组长度不够,都会抛出异常。

文档

2. arr.clone()

这个方法实际上是从 Object 里继承过来的。用来克隆本数组,返回一个新数组。

定义:

java 复制代码
protected Object clone();

例:

java 复制代码
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = null;
arr2 = arr1.clone();

文档

3. Arrays.copyOf()

Arrays 位于 import java.util.Arrays 下。

这个函数有两个版本:

java 复制代码
<T> T[] java.util.Arrays.copyOf(T[] original, int newLength)
<T, U> T[] java.util.Arrays.copyOf(U[] original, int newLength, Class<? extends T[]> newType)

文档

<T>

复制指定数组为一个新的、指定长度的数组。

新长度可以:

  1. 和原来的一样长:全部复制
  2. 比原来的短:只复制源数组前面一部分
  3. 比原来的长:新数组多余的部分用 null 填充

<T, U>

复制指定数组为一个新的、指定长度、指定类型的数组。

源数组里的内容会被自动转换为新数组的类型。但注意,源数组的元素类型必须可以被转换为新类型,否则会抛出 ArrayStoreException 异常。

例:

java 复制代码
Integer[] arr1 = { 1, 2, 3, 4, 5 };
// 注意 <T,U> 版本的第三个参数 `newType` 是目标数组类型,不是目标数组元素类型
// 所以应该是 Object[].class,而不是 Object.class
Object[] arr2 = Arrays.copyOf(arr1, 4, Object[].class);
for (Object object : arr2) {
	System.out.println(object);
}

4. Arrays.copyOfRange()

这个方法同样有两个定义:

java 复制代码
<T> T[] copyOfRange(T[] original, int from, int to);
<T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType);

Arrays.copyOfRange()Arrays.copyOf(),差不多,只是前者可以指定起始位置而已。

总结

四种方法的实现关系(箭头表示"调用了 "):

所以 System.arraycopyObject.clone() 的效率要比 Arrays 高。

四种方法的特点比较:

相关推荐
0白露1 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.2 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐2 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch4 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
天天向上杰5 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal