Java数组复制的五种常用方法及对比

今天早睡
今天早睡
发布时间:2026-10-15| 3人浏览过
原创

在Java开发中,数组复制是常见的基础操作。本文梳理了五种主流实现方式,涵盖从底层位移到API封装的各种手段,并附带完整测试代码与结果验证。

5种数组复制方法

第1步:使用for循环手动赋值(基础法)

这是最直观的实现方式,通过遍历原数组将元素逐一写入新数组或已分配空间的数组中。其核心优势在于逻辑简单易懂,但代码量相对较多,且性能取决于JIT编译优化。

操作示例:

public static void method01(int[] arr, int[] ans) {
    for (int i = 0; i < arr.length; i++) {
        ans[i] = arr[i];
    }
    System.out.println("原始复制方法:" + Arrays.toString(ans));
}

第2步:使用 Arrays.copyOf() 方法

Arrays.copyOf() 会根据指定长度创建一个新的数组对象。如果指定长度大于原数组长度,多余部分用默认值填充;若小于原长度,则截断。该方法会返回新数组引用,原有目标数组会被丢弃(重构)。

语法结构:

Arrays.copyOf(dataType[] srcArray, int length)

注意: 此方法适用于需要扩容或缩容的场景。若只需精确拷贝,需传入原数组长度。

ans = Arrays.copyOf(arr, arr.length); // 精确拷贝
ans = Arrays.copyOf(arr, arr.length + 3); // 扩容拷贝

第3步:使用 Arrays.copyOfRange() 方法

当只需要复制数组的某一段区间时使用此方法。startIndex 包含在内,endIndex 不包含在内。它同样会生成一个新数组。

语法结构:

Arrays.copyOfRange(srcArray, int startIndex, int endIndex)
// 示例:复制索引0到length之间的所有元素
ans = Arrays.copyOfRange(arr, 0, arr.length + 3);

第4步:使用 System.arraycopy() 方法(最高效)

该方法位于 java.lang.System 类中,是底层C/C++实现的本地方法,执行效率通常高于其他几种方式。它要求目标数组必须预先存在,且直接修改目标数组内容,而非返回新数组。

参数说明:

  • srcArray:源数组
  • srcIndex:源数组起始位置
  • destArray:目标数组
  • destIndex:目标数组起始位置
  • length:要复制的元素个数

关键约束: srcIndex + length <= srcArray.length 且 destIndex + length <= destArray.length,否则抛出 IndexOutOfBoundsException。

System.arraycopy(arr, 0, ans, 0, arr.length);

第5步:使用 Object.clone() 方法

数组本身继承自 Object,因此可直接调用 clone() 方法创建副本。这是一种简洁的浅拷贝方式,返回的是与原数组类型相同的新数组。

语法结构:

newArr = originalArr.clone();
public static void method05(int[] arr, int[] ans) {
    ans = arr.clone(); // 强制转换可能隐含在上下文中,此处为基本类型无影响
    System.out.println("clone()方法:" + Arrays.toString(ans));
}

重要概念:浅拷贝与深拷贝

上述所有针对 int[]、double[] 等基本数据类型数组的复制均为浅拷贝。对于基本类型,数据存储在栈或堆的直接内存中,复制后两个数组互不影响。

但如果数组包含对象(如 String[] 或自定义对象数组),clone() 和 arraycopy 仅复制对象的引用地址。修改一个数组中对象的内容,会影响另一个数组中的对应对象。若需完全独立的深拷贝,需手动遍历并实例化每个子对象。

性能与场景总结

  1. System.arraycopy:速度快,适合大量数据的移动或覆盖,需预先分配目标空间。
  2. Arrays.copyOf/copyOfRange:代码简洁,自动处理内存分配,适合需要根据长度变化动态调整数组的场景。
  3. clone():语义清晰,适合快速制作当前数组的一份镜像。
  4. for循环:灵活性最高,可在赋值过程中进行过滤、转换等操作。

完整测试用例

以下代码演示了前四种方法与 clone 的实际输出结果:

package com.zhuang;

import java.util.Arrays;

public class ArrayCopyTest {
    public static void main(String[] args) {
        int[] arr = new int[] { 57, 81, 68, 75, 91 };
        int[] ans = new int[arr.length];

        // 1. 循环复制
        for (int i = 0; i < arr.length; i++) ans[i] = arr[i];
        System.out.println("Loop: " + Arrays.toString(ans));

        // 2. copyOf
        ans = Arrays.copyOf(arr, arr.length);
        System.out.println("copyOf: " + Arrays.toString(ans));

        // 3. copyOfRange
        ans = Arrays.copyOfRange(arr, 0, arr.length);
        System.out.println("copyOfRange: " + Arrays.toString(ans));

        // 4. arraycopy
        ans = new int[arr.length];
        System.arraycopy(arr, 0, ans, 0, arr.length);
        System.out.println("arraycopy: " + Arrays.toString(ans));

        // 5. clone
        ans = (int[]) arr.clone();
        System.out.println("clone: " + Arrays.toString(ans));
    }
}

以上就是Java数组复制方法的详细内容,更多关于Java数组操作技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。