当前位置: 首页 > news >正文

【java】方法--拷贝数组

在 Java 中,拷贝数组 是指将一个数组的内容复制到另一个数组中。数组拷贝可以分为 浅拷贝 和 深拷贝,具体取决于数组元素的类型(基本数据类型或引用数据类型)。以下是几种常见的数组拷贝方法:


1. 使用 for 循环手动拷贝

这是最基础的方法,通过遍历原数组,将每个元素复制到新数组中。

示例:

java

Copy

public class Main {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};
        int[] copy = new int[original.length];

        // 使用 for 循环拷贝数组
        for (int i = 0; i < original.length; i++) {
            copy[i] = original[i];
        }

        // 打印拷贝后的数组
        for (int num : copy) {
            System.out.print(num + " ");
        }
    }
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


2. 使用 System.arraycopy() 方法

System.arraycopy() 是 Java 提供的一个高效数组拷贝方法。

语法:

java

Copy

System.arraycopy(原数组, 原数组起始位置, 目标数组, 目标数组起始位置, 拷贝长度);
示例:

java

Copy

public class Main {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};
        int[] copy = new int[original.length];

        // 使用 System.arraycopy 拷贝数组
        System.arraycopy(original, 0, copy, 0, original.length);

        // 打印拷贝后的数组
        for (int num : copy) {
            System.out.print(num + " ");
        }
    }
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 高效,底层是 native 方法。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


3. 使用 Arrays.copyOf() 方法

Arrays.copyOf() 是 Java 提供的一个简便的数组拷贝方法。

语法:

java

Copy

目标数组 = Arrays.copyOf(原数组, 新数组长度);
示例:

java

Copy

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};

        // 使用 Arrays.copyOf 拷贝数组
        int[] copy = Arrays.copyOf(original, original.length);

        // 打印拷贝后的数组
        for (int num : copy) {
            System.out.print(num + " ");
        }
    }
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 简洁易用。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


4. 使用 clone() 方法

Java 中的数组是对象,因此可以使用 clone() 方法来拷贝数组。

示例:

java

Copy

public class Main {
    public static void main(String[] args) {
        int[] original = {1, 2, 3, 4, 5};

        // 使用 clone 方法拷贝数组
        int[] copy = original.clone();

        // 打印拷贝后的数组
        for (int num : copy) {
            System.out.print(num + " ");
        }
    }
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 简单易用。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


5. 深拷贝与浅拷贝

  • 浅拷贝:只拷贝数组的引用,新数组和原数组共享相同的元素(适用于基本数据类型数组)。

  • 深拷贝:拷贝数组的所有元素,包括引用数据类型数组中的对象(需要手动实现)。

深拷贝示例:

java

Copy

class Person implements Cloneable {
    String name;

    Person(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person[] original = {new Person("Alice"), new Person("Bob")};
        Person[] copy = new Person[original.length];

        // 深拷贝
        for (int i = 0; i < original.length; i++) {
            copy[i] = (Person) original[i].clone();
        }

        // 修改原数组中的对象
        original[0].name = "Charlie";

        // 打印拷贝后的数组
        for (Person person : copy) {
            System.out.println(person.name);
        }
    }
}
  • 输出结果

    Copy

    Alice
    Bob
  • 特点

    • 深拷贝后,修改原数组中的对象不会影响新数组。


6. 总结

  • 浅拷贝:适用于基本数据类型数组,或引用数据类型数组的引用拷贝。

  • 深拷贝:适用于引用数据类型数组,需要手动实现。

  • 常用方法

    • for 循环:灵活,适用于所有场景。

    • System.arraycopy():高效,推荐使用。

    • Arrays.copyOf():简洁易用。

    • clone():简单,但需要实现 Cloneable 接口。

相关文章:

  • Hami项目开发笔记
  • 1.从零开始学会Vue--{{基础指令}}
  • 浅介绍redis特性
  • DeepSeek-R1本地部署配置要求
  • vscode配置django环境并创建django项目(全图文操作)
  • 每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
  • Vue3折线图,柱状图,饼图,各种图表,适用于所有全平台
  • Vscode 主题,文件图标,插件
  • Kotlin 2.1.0 入门教程(二十一)数据类
  • AI Agent 有哪些痛点问题
  • Windows操作系统部署Tomcat详细讲解
  • 47.实验室管理系统(基于SSM和html的Java项目)
  • Deepseek 限速||Deepseek 错误码
  • 搭建Windows下的嵌入式开发环境(TODO)
  • 计算机视觉:卷积神经网络(CNN)基本概念(一)
  • 【嵌入式Linux应用开发基础】read函数与write函数
  • SQL Server的安装和简单使用
  • 如何在wps中使用AI
  • DeepSeek教unity------MessagePack-02
  • JAVA实现登录过程--详细版(学习自用)
  • 游戏论|暴君无道,吊民伐罪——《苏丹的游戏》中的政治
  • 巴军事行动致印度70%电网瘫痪
  • 习近平同俄罗斯总统普京茶叙
  • 上海优化营商环境再攻坚,企业和机构有哪些切实感受?
  • 东亚社会的“苦难诗学”:从《苦尽柑来遇见你》说起
  • 美联储主席:美联储工作方式不会受特朗普影响,从未寻求与总统会面