Java数组拷贝的四种常用方式总结
作者:Geoking.
数组是 Java 最基础的数据结构之一,而 数组的拷贝(复制) 是开发中经常遇到的需求,Java 提供了多种数组复制方式,每种方式都有自己的特点和适用场景,本篇文章将系统总结 Java 中 数组拷贝的 4 种常用方式,需要的朋友可以参考下
引言
数组是 Java 最基础的数据结构之一,而 数组的拷贝(复制) 是开发中经常遇到的需求,例如:
- 扩容数组
- 复制部分元素
- 深拷贝/防御性拷贝
- 避免直接引用修改原数组
Java 提供了多种数组复制方式,每种方式都有自己的特点和适用场景。
本篇文章将系统总结 Java 中 数组拷贝的 4 种常用方式。
一、Java 数组拷贝的四种方式
1. 使用for循环(最原始、最灵活)
示例代码:
int[] src = {1, 2, 3, 4};
int[] dest = new int[src.length];
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}
优点:
- 简单直接
- 可自定义拷贝规则(如过滤、条件拷贝)
缺点:
- 代码冗长
- 性能较低(相比原生 API)
适用于 需要完全自定义拷贝行为的场景。
2. 使用System.arraycopy()(性能最优)
示例代码:
int[] src = {1, 2, 3, 4};
int[] dest = new int[4];
System.arraycopy(src, 0, dest, 0, src.length);
参数解释:
System.arraycopy(
Object src, // 源数组
int srcPos, // 源数组起始下标
Object dest, // 目标数组
int destPos, // 目标数组起始下标
int length // 拷贝长度
);
优点:
- 底层为 JVM 实现(native native 方法),性能最高
- 可指定部分区域拷贝
缺点:
- 参数较多,容易出错
- 类型必须兼容(否则抛异常)
最推荐用于 高性能场景。
3. 使用Arrays.copyOf()/Arrays.copyOfRange()(最常用)
3.1Arrays.copyOf()
适合复制整个数组或扩容数组。
int[] src = {1, 2, 3};
int[] dest = Arrays.copyOf(src, 5); // 扩容成长度 5
输出:
[1, 2, 3, 0, 0]
3.2Arrays.copyOfRange()
适合复制部分区域。
int[] src = {1, 2, 3, 4, 5};
int[] part = Arrays.copyOfRange(src, 1, 4);
输出:
[2, 3, 4]
优点:
- 使用简单,参数不多
- 可以返回不同长度的新数组
- 返回泛型,支持所有类型
缺点:
- 性能略逊于 System.arraycopy(内部也是基于它实现)
最常用于 普通开发、快速复制、数组扩容。
4. 使用clone()(最简洁的深拷贝)
示例代码:
int[] src = {1, 2, 3};
int[] dest = src.clone();
优点:
- 语法最简单
- 创建的是独立数组,不会影响原数组
- 性能很好,底层仍然是
System.arraycopy
缺点:
- 只适用于一维数组
- 对于二维数组只复制外层,是浅拷贝:
int[][] arr2d = {{1,2}, {3,4}};
int[][] clone = arr2d.clone();
clone[0][0] = 99;
System.out.println(arr2d[0][0]); // 99(浅拷贝)
适用于 简单复制整个数组的场景。
二、四种数组复制方式对比总结
| 方法 | 是否新数组 | 是否支持部分复制 | 性能 | 是否浅拷贝 | 适用场景 |
|---|---|---|---|---|---|
for循环 | ✔ | ✔(自定义) | ⭐☆☆ | 深拷贝 | 自定义规则 |
System.arraycopy | ✔ | ✔ | ⭐⭐⭐ | 浅拷贝 | 高性能需求 |
Arrays.copyOf | ✔ | ✘(复制整个) | ⭐⭐⭐ | 浅拷贝 | 扩容 / 常规复制 |
Arrays.copyOfRange | ✔ | ✔ | ⭐⭐⭐ | 浅拷贝 | 区间复制 |
clone() | ✔ | ✘ | ⭐⭐⭐ | 浅拷贝 | 快速整体复制 |
一句话总结:
普通场景用 Arrays.copyOf
高性能场景用 System.arraycopy
语法最简单用 clone()
自定义逻辑用 for 循环
到此这篇关于Java数组拷贝的四种常用方式总结的文章就介绍到这了,更多相关Java数组拷贝方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
