【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 高。

四种方法的特点比较:

相关推荐
a努力。9 分钟前
腾讯Java面试被问:String、StringBuffer、StringBuilder区别
java·开发语言·后端·面试·职场和发展·架构
长安第一美人11 分钟前
php出现zend_mm_heap corrupted 或者Segment fault
开发语言·嵌入式硬件·php·zmq·工业应用开发
gihigo199817 分钟前
基于MATLAB的电力系统经济调度实现
开发语言·matlab
飛6791 小时前
从 0 到 1 掌握 Flutter 状态管理:Provider 实战与原理剖析
开发语言·javascript·ecmascript
龚礼鹏1 小时前
Android应用程序 c/c++ 崩溃排查流程
c语言·开发语言·c++
Filotimo_1 小时前
在java开发中,什么是JSON格式
开发语言·json
Vic101011 小时前
解决 Spring Security 在异步线程中用户信息丢失的问题
java·前端·spring
咕噜签名-铁蛋1 小时前
云服务器远程连接失败?
开发语言·php
QD_IT伟2 小时前
SpringBoot项目整合Tlog 数据链路的规范加强
java·spring boot·后端
源码获取_wx:Fegn08952 小时前
基于springboot + vue二手交易管理系统
java·vue.js·spring boot·后端·spring·课程设计