【Java】数组拷贝的三种方式

本文详细介绍了Java中数组复制的方法,包括System.arraycopy的功能及使用方法,Arrays.copyOf的具体实现方式,以及Object.clone的应用。通过实例展示了不同复制方法的效果,帮助读者理解一维数组与二维数组复制的区别。

System.arraycopy

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

src:原数组对象
srcPos:原数组起始位置
dest:目标数组对象
destPos:目标数组起始位置
length:复制长度

注意不要以为src和dest是Object类型,就可以随便传参,不是数组对象会报错。

该方法有一个一维数组、二维数组复制的区别,一维数组拷贝其值,二维数组拷贝引用,具体原理我将不清楚,有兴趣可以运行如下代码。


public class SystemArrayCopy {

    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = new int[3];

        System.arraycopy(arr1, 0, arr2, 0, arr2.length);
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i] + " ");
        }

        System.out.println();

        String[] sArr1 = {"China", "Japan", "Korea"};
        String[] sArr2 = new String[3];
        System.arraycopy(sArr1, 0, sArr2, 0, sArr2.length);
        for (int i = 0; i < sArr2.length; i++) {
            System.out.print(sArr2[i] + " ");
        }

        System.out.println();

        sArr1[0] = "USA";
        for (int i = 0; i < sArr2.length; i++) {
            System.out.print(sArr2[i] + " ");
        }

        System.out.println();

        String[][] ss1 = {{"sh", "js", "zj"}, {"bj", "tj", "hb"}, {"sc", "cq", "yn"}};
        String[][] ss2 = new String[ss1.length][ss1[0].length];
        System.arraycopy(ss1, 0, ss2, 0, ss1.length);
        for (int i = 0; i < ss2.length; i++) {
            for (int j = 0; j < ss2[i].length; j++)
                System.out.print(ss2[i][j] + " ");

            System.out.println();
        }

        System.out.println();

        ss1[0][0] = "dsh";
        for (int i = 0; i < ss2.length; i++) {
            for (int j = 0; j < ss2[i].length; j++)
                System.out.print(ss2[i][j] + " ");

            System.out.println();
        }
    }

}

Arrays.copyOf

Arrays.copyOf()重载了很多类型,以int型为例
public static int[] copyOf(int[] original, int newLength);

original:原数组
newLength:复制长度

返回新复制的数组对象

分析Arrays的源代码可知底层实际上是调用System.arraycopy()

Object.clone

在Java中,数组也是一种对象,所以可以使用clone()方法。

 String[] sArr1 = {"China", "Japan", "Korea"};
String[] sArr2;
sArr2 = sArr1.clone();

for (int i = 0; i < sArr2.length; i++) {
     System.out.print(sArr2[i] + " ");
}
<think>首先,用户的问题是:“我想查找Java中用于数组拷贝的工具类或方法 请问Java 数组拷贝 工具类 方法”。这很直接:用户想知道Java中用于数组拷贝的工具类方法。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式(但这里可能不涉及数学,因为主题是Java编程)。 - 独立公式使用$$...$$(同样,可能不适用)。 - LaTeX语法正确(但回答主要是文本)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户可见层的要求: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用提供了几个引用: - [^1]: 关于Java数组拷贝方法的概述,包括for循环、Arrays.copyOf()、System.arraycopy()、clone(),并指出是浅拷贝。 - [^2]: 详细介绍了数组拷贝的几种方式:clone、System.arraycopy、Arrays.copyOf、Arrays.copyOfRange,并举例说明。 - [^3]: 讨论Java数组常见问题拷贝方式,包括for循环、Arrays.copyOf()、System.arraycopy()、clone()。 - [^4]: 示例使用System.arraycopy()进行数组扩容。 - [^5]: 示例使用for循环进行数组拷贝。 这些引用确认了Java数组拷贝的主要方法: 1. for循环手动拷贝。 2. Arrays.copyOf()。 3. System.arraycopy()。 4. clone()方法。 所有这些都是浅拷贝。 我的回答应该结构清晰: 1. 介绍Java数组拷贝的概念。 2. 列出并解释主要的工具类方法。 3. 提供简单示例(如果可能)。 4. 添加引用标识。 5. 生成相关问题。 由于是中文回答,所有内容用中文。 结构: - 开头:直接回答问题。 - 主体:逐步介绍方法。 - 结尾:总结并生成相关问题。 生成相关问题:基于主题,如性能、优化、应用场景等。 最终回答: - 先解释。 - 然后列出方法。 - 添加引用。 - 最后生成相关问题。</think>### Java数组拷贝的工具类方法 在Java中,数组拷贝是一个常见的操作,用于创建数组的副本。Java提供了多种工具类方法来实现数组拷贝,包括浅拷贝(即只复制数组元素本身,而不复制元素指向的对象)。以下我将逐步介绍主要的工具类方法,确保回答真实可靠,并基于权威文档最佳实践。 #### 1. **核心工具类方法** Java数组拷贝主要通过以下方式实现,这些方法都属于浅拷贝: - **`Arrays.copyOf()`**:这是`java.util.Arrays`工具类提供的方法,用于创建新数组并复制源数组元素。它支持指定新数组的长度,如果长度大于源数组,多余部分填充默认(如0或null)。 - 示例:`int[] newArr = Arrays.copyOf(sourceArr, length);` - 优点:简洁易用,适合快速拷贝整个数组[^1][^2][^3]。 - **`System.arraycopy()`**:这是一个原生方法,属于`java.lang.System`类,用于高效地复制数组片段。它需要指定源数组、源起始位置、目标数组、目标起始位置复制的长度。 - 示例:`System.arraycopy(srcArr, srcPos, destArr, destPos, length);` - 优点:性能高,适合处理大数组或部分拷贝[^2][^3][^4]。 - **`clone()`**:所有Java数组都继承自`Object`类,因此可以使用`clone()`方法创建浅拷贝副本。它不需要额外参数,直接返回新数组。 - 示例:`int[] newArr = sourceArr.clone();` - 优点:语法简单,但仅适用于数组类型[^1][^2][^3]。 - **手动`for`循环**:如果不需要工具类,可以通过循环遍历数组元素手动复制。这提供了最大灵活性,但代码冗长。 - 示例:`for (int i = 0; i < sourceArr.length; i++) { destArr[i] = sourceArr[i]; }` - 适用场景:当需要自定义拷贝逻辑时[^1][^3][^5]。 #### 2. **关键区别注意事项** - **浅拷贝 vs 深拷贝**:以上方法都是浅拷贝。如果数组元素是对象(如自定义类),拷贝后新旧数组共享同一对象引用。如果需要深拷贝(即复制对象本身),必须手动实现或使用序列化库[^1][^2]。 - **性能**:`System.arraycopy()`通常性能最优,因为它是原生方法;`Arrays.copyOf()`内部也调用`System.arraycopy()`。`clone()``for`循环在小型数组上效率相近,但大型数组时较慢。 - **工具类依赖**:`Arrays.copyOf()`需要导入`java.util.Arrays`,而`System.arraycopy()``clone()`是Java核心API的一部分。 - **常见错误**:数组越界(如`System.arraycopy()`中长度设置错误)或空指针异常(源数组为null)。使用前应检查数组边界[^3][^4]。 #### 3. **简单示例代码** 以下是一个演示主要方法的Java代码片段: ```java import java.util.Arrays; public class ArrayCopyDemo { public static void main(String[] args) { int[] srcArr = {1, 2, 3, 4, 5}; // 使用Arrays.copyOf() int[] copy1 = Arrays.copyOf(srcArr, srcArr.length); System.out.println("Arrays.copyOf(): " + Arrays.toString(copy1)); // 输出: [1, 2, 3, 4, 5] // 使用System.arraycopy() int[] copy2 = new int[srcArr.length]; System.arraycopy(srcArr, 0, copy2, 0, srcArr.length); System.out.println("System.arraycopy(): " + Arrays.toString(copy2)); // 输出: [1, 2, 3, 4, 5] // 使用clone() int[] copy3 = srcArr.clone(); System.out.println("clone(): " + Arrays.toString(copy3)); // 输出: [1, 2, 3, 4, 5] } } ``` 此代码展示了如何完整拷贝数组,输出结果一致。实际使用时,根据需求选择方法[^2][^4][^5]。 #### 总结 Java提供了多种数组拷贝工具类方法:`Arrays.copyOf()`适合快速全拷贝,`System.arraycopy()`高效且灵活,`clone()`简单但局限,手动`for`循环用于定制场景。所有方法都是浅拷贝,开发时需注意对象引用的共享问题。推荐优先使用`System.arraycopy()`或`Arrays.copyOf()`以获得最佳性能[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值