Java数组篇[7]:数组拷贝

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在Java程序设计中,经常需要复制数组或创建数组的克隆。这在修改数组内容时保留原始数据不变,或者在多线程环境中避免数据竞争时非常有用。

摘要

本文将探讨Java中数组拷贝和克隆的不同方法,包括手动拷贝、使用System.arraycopy()方法、以及数组的克隆。

概述

数组拷贝是创建数组内容的一个副本,而克隆则是创建数组对象的一个完整副本。在Java中,数组是引用类型,所以简单的赋值操作只会复制引用,而不是数组对象本身。

数组拷贝

手动拷贝

手动拷贝数组是通过遍历原数组并将元素赋值给新数组来实现的。

int[] originalArray = {1, 2, 3};
int[] copiedArray = new int[originalArray.length];
for (int i = 0; i < originalArray.length; i++) {
    copiedArray[i] = originalArray[i];
}

使用System.arraycopy()

Java提供了System.arraycopy()方法来进行数组拷贝,这是一种更高效的方式。

int[] sourceArray = {1, 2, 3};
int[] destinationArray = new int[3];
System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);

数组克隆

数组的克隆创建了数组的一个副本,包括数组中的所有元素。

int[] originalArray = {1, 2, 3};
int[] clonedArray = originalArray.clone();

使用案例分享

假设我们需要在不改变原始数组的情况下,对数组的一个副本进行修改。

int[] originalArray = {1, 2, 3};
int[] modifiedArray = originalArray.clone();
modifiedArray[0] = 100; // 修改副本数组的第一个元素

  针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码演示了如何克隆数组以及如何修改克隆后的数组而不改变原始数组。下面是对代码的逐行解释:

  1. int[] originalArray = {1, 2, 3};:声明并初始化了一个名为originalArray的整型数组,包含三个元素:1, 2, 3。

  2. int[] modifiedArray = originalArray.clone();:使用clone()方法克隆originalArray,创建了一个新的数组modifiedArray。这个新数组是originalArray的一个副本,它们的内容相同,但是实际上是两个不同的对象。

  3. modifiedArray[0] = 100;:修改modifiedArray的第一个元素,将其值设置为100。这一步不会影响originalArray,因为modifiedArray是一个独立的副本。

执行这段代码后,originalArray保持不变,其内容仍然是[1, 2, 3],而modifiedArray变为[100, 2, 3]。这演示了克隆数组的一个重要用途:允许你在不影响原始数据的情况下,对数据的副本进行修改。

这种技术在多种编程场景中都非常有用,例如:

  • 当你想要保留原始数据的备份,同时在函数中修改数据时。
  • 在多线程环境中,为了避免多个线程同时修改同一个数组,可以为每个线程提供数组的克隆。

请注意,如果数组是多维的或者数组中包含的是对象的引用,那么clone()方法只是克隆了数组的第一层,也就是说,它不会递归地克隆数组中的每个对象。在这种情况下,对象的引用在原始数组和克隆数组之间是共享的。

应用场景案例

在多线程环境中,为了避免多个线程同时修改同一个数组,可以为每个线程提供数组的克隆。

优缺点分析

手动拷贝

  • 优点:简单易懂。
  • 缺点:代码冗长,容易出错。

System.arraycopy()

  • 优点:高效,性能好。
  • 缺点:使用较为复杂,需要手动管理源数组和目标数组。

数组克隆

  • 优点:简单,一行代码即可完成。
  • 缺点:如果数组包含引用类型,克隆的是引用而不是对象本身。

核心类方法介绍

  • clone():数组的clone()方法返回数组的一个副本。

测试用例

以下是使用main函数的一个测试用例,演示了数组的拷贝和克隆。

测试代码

/**
 * @Author ms
 * @Date 2024-07-31 11:26
 */
public class Test7 {

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

        // 手动拷贝数组
        int[] manualCopy = new int[originalArray.length];
        for (int i = 0; i < originalArray.length; i++) {
            manualCopy[i] = originalArray[i];
        }
        System.out.println("手动拷贝: " + Arrays.toString(manualCopy));

        // 使用System.arraycopy拷贝数组
        int[] arrayCopy = new int[originalArray.length];
        System.arraycopy(originalArray, 0, arrayCopy, 0, originalArray.length);
        System.out.println("System.arraycopy拷贝: " + Arrays.toString(arrayCopy));

        // 数组克隆
        int[] clonedArray = originalArray.clone();
        System.out.println("数组克隆: " + Arrays.toString(clonedArray));
    }
}

测试代码执行结果

  根据如上测试用例,我本地演示结果展示如下,仅供参考哈,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

代码分析

  针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码演示了三种不同的数组拷贝方法:手动拷贝、使用System.arraycopy()方法拷贝以及数组的克隆。下面是对代码的逐行解释:

  1. 以多行注释形式提供了作者信息和日期。

  2. public class Test7:定义了一个名为Test7的公共类。

  3. public static void main(String[] args):这是程序的入口点,main方法。

  4. int[] originalArray = {1, 2, 3, 4, 5};:声明并初始化了一个整型数组originalArray

5-12. 手动拷贝数组:

  • 创建一个新数组manualCopy,长度与originalArray相同。
  • 使用for循环将originalArray中的元素复制到manualCopy中。
  • 打印手动拷贝后的数组。

13-18. 使用System.arraycopy()拷贝数组:

  • 创建一个新数组arrayCopy,长度与originalArray相同。
  • 使用System.arraycopy()方法将originalArray中的所有元素复制到arrayCopy中。
  • 打印使用System.arraycopy()拷贝后的数组。

19-22. 数组克隆:

  • 使用clone()方法克隆originalArray,得到clonedArray
  • 打印克隆后的数组。

当这段代码执行时,它将输出三次数组内容,分别对应手动拷贝、System.arraycopy()拷贝和克隆的结果。输出结果将类似于:

手动拷贝: [1, 2, 3, 4, 5]
System.arraycopy拷贝: [1, 2, 3, 4, 5]
数组克隆: [1, 2, 3, 4, 5]

这段代码展示了三种不同的数组复制技术,每种技术都有其用途和优势。手动拷贝提供了最大的灵活性,System.arraycopy()提供了高性能的数组复制能力,而克隆方法则提供了一种快速简便的数组复制方式。在实际编程中,可以根据需要选择最合适的方法。

小结

本文介绍了Java中数组拷贝和克隆的几种方法。手动拷贝直观但冗长,System.arraycopy()高效但复杂,而数组克隆简单快捷。选择合适的方法可以提高代码的效率和可读性。

总结

数组的拷贝和克隆是Java编程中常见的操作。理解这些操作的区别和适用场景,可以帮助开发者在不同的编程任务中做出恰当的选择。无论是手动拷贝、使用System.arraycopy()还是数组克隆,每种方法都有其用武之地。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值