一次搞定:Java中数组拷贝VS数组克隆

2024-01-25 12:19:48 浏览数 (1)

哈喽,各位小伙伴们,你们好呀,我是喵手。

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

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

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

前言

  在Java中,数组是一种非常重要的数据结构,而数组的拷贝和克隆在实际开发中也经常用到。但是,对于初学者来说,数组拷贝和数组克隆这两个概念可能会让他们感到困惑。因此,本文将通过讲解Java中的数组拷贝和数组克隆来帮助读者更好地掌握这两个概念。

摘要

  本文将首先简要介绍Java中的数组概念,然后分别介绍数组拷贝和数组克隆的含义和用法。接着通过源代码解析,应用场景案例和优缺点分析等方面来对它们进行深入探讨。最后,本文将给出类代码方法介绍和测试用例,并进行全文小结和总结。

Java中数组拷贝VS数组克隆

简介

  在Java中,数组是一组同类型数据的集合,而数组的拷贝和克隆都是对数组进行复制的操作。数组拷贝和数组克隆虽然看起来很相似,但实际上它们之间有很大的区别。

  数组拷贝可以将一个数组中的数据复制到另一个数组中,而数组克隆则是创建一个新的数组对象,该对象和原始数组对象具有相同类型和大小,并且将原始数组中的所有元素逐个复制到新数组中。

源代码解析

  在Java中,我们通常使用System.arraycopy()方法进行数组拷贝操作,使用数组的clone()方法进行数组克隆操作。下面是它们的用法:

数组拷贝

代码语言:java复制
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

代码分析:

  该代码定义了一个静态方法 arraycopy,接收 5 个参数:

  1. src:源数组对象;
  2. srcPos:源数组中的起始位置(从 0 开始计数);
  3. dest:目标数组对象;
  4. destPos:目标数组中的起始位置(从 0 开始计数);
  5. length:要复制的元素个数。

  该方法的作用是将源数组中指定位置的元素复制到目标数组中指定位置,可以用来实现数组的复制、剪切和粘贴等操作。该方法可以处理任意类型的数组对象,参数类型为 Object,需要在调用时进行类型转换。

  上面的方法将从源数组src中复制数据到目标数组dest中,其中srcPos是源数组的起始位置,destPos是目标数组的起始位置,length是要复制的元素数。

下面是一个示例:

代码语言:java复制
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[5];
System.arraycopy(srcArray, 0, destArray, 0, 5);

  上面的代码将srcArray数组中的所有元素复制到destArray数组中。复制之后,srcArray数组和destArray数组中的数据将完全相同。

代码分析:

  这段代码使用了Java中的System类的arraycopy方法。这个方法用于将一个数组的元素复制到另一个数组中。

其中,srcArray是源数组,包含要复制的元素;destArray是目标数组,即复制后的数组;0表示从源数组的第0个元素开始复制;5表示复制5个元素,即源数组中从第0个元素开始到第4个元素为止的所有元素。

因此,这段代码的作用是将srcArray数组中的所有元素复制到destArray数组中,最终得到两个数组中的元素是相同的。

数组克隆

  数组克隆是通过调用数组对象的clone()方法来实现的。这个方法创建一个新的数组对象,该对象和原始数组对象具有相同类型和大小,并且将原始数组中的所有元素逐个复制到新数组中。示例如下:

代码语言:java复制
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = srcArray.clone();

  上面的代码将srcArray数组克隆到destArray数组中。由于克隆后的数组和原始数组具有相同的大小和元素值,因此它们是相等的。

代码分析:

  这段代码定义了一个整型数组 srcArray,其中包含了 1 到 5 这 5 个整数。然后通过调用 srcArray 的 clone() 方法,将其复制到另一个数组 destArray 中。

这样做的目的是创建一个新的数组对象,它的元素和原始数组相同,但是它们在内存中的位置是不同的,因此对其中一个数组进行修改将不会影响到另一个数组。

需要注意的是,使用 clone() 方法来复制数组时,必须确保被复制的数组是一个对象数组或基本类型数组。对于其他类型的数组,如 String 数组等,需要使用其他方法来复制。

应用场景案例

数组拷贝

  在实际开发中,数组拷贝经常被用来将一个数组的数据复制到另一个数组中。例如,当我们需要对一个数组进行排序时,通常会先将原始数组复制到一个新的数组中,然后对新数组进行排序,以避免原始数组数据的改变。

  另外,数组拷贝还可以用来将一个数组的部分数据复制到另一个数组中。例如:

代码语言:java复制
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[3];
System.arraycopy(srcArray, 0, destArray, 0, 3);

  上面的代码将srcArray数组中的前三个元素复制到destArray数组中。复制之后,destArray数组中的数据为{1, 2, 3}。

代码分析:

  这段代码使用了Java中的System类的一个方法arraycopy,将srcArray中前3个元素复制到destArray中。具体来说,参数说明如下:

  • srcArray:源数组,即需要复制的数组。
  • 0:源数组中需要复制的起始位置,即从第0个元素开始复制。
  • destArray:目标数组,即需要将数据复制到的数组。
  • 0:目标数组中需要复制的起始位置,即从第0个元素开始复制。
  • 3:需要复制的元素个数,即从源数组中复制前3个元素到目标数组中。

因此,经过这段代码执行后,destArray中的元素为{1, 2, 3}。注意,如果destArray的长度小于3,则会抛出ArrayIndexOutOfBoundsException异常。

数组克隆

  数组克隆在实际开发中也有多种用途。例如,当我们需要对一个数组进行修改时,可以先将原始数组克隆到一个新的数组中,然后对新数组进行修改,以避免原始数组数据的改变。

  另外,数组克隆还可以用来创建一个与原始数组相同元素的数组,以避免在不同的方法中共享同一个数组对象。例如:

代码语言:java复制
int[] originalArray = {1, 2, 3, 4, 5};
int[] newArray = originalArray.clone();

  上面的代码将originalArray数组克隆到newArray数组中。由于newArray数组是一个新的对象,并且与originalArray数组具有相同的元素和大小,因此在不同的方法中共享newArray数组不会影响originalArray数组。

代码分析:

  该代码定义了两个整型数组:originalArray和newArray。原始数组originalArray中包含了1到5这五个整数。然后使用clone()方法将原始数组复制到了新数组newArray中,这样新数组也包含了1到5这五个整数。这里需要注意的是,原始数组和新数组虽然会包含相同的元素,但是它们是不同的数组对象,它们在内存中的地址是不同的。因此,对于新数组的任何修改操作都不会影响到原始数组。

优缺点分析

数组拷贝

  数组拷贝的优点是可以将一个数组中的元素复制到另一个数组中,使得所有操作都在新的数组上进行,不会影响原始数组。数组拷贝的缺点是需要手动指定源数组和目标数组的位置和元素个数,如果指定的参数有误,将会出现数组越界和数据覆盖等问题。

数组克隆

  数组克隆的优点是可以创建一个与原始数组相同元素的新数组对象,以避免在不同的方法中共享同一个数组对象的问题。数组克隆的缺点是需要调用clone()方法,如果未正确重写这个方法,将会出现克隆出的新数组与原始数组不一致的问题。

类代码方法介绍

数组拷贝

代码语言:java复制
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

数组克隆

代码语言:java复制
public Object clone() throws CloneNotSupportedException

测试用例

  我们可以编写一个简单的Java程序来测试数组拷贝和数组克隆的功能。

数组拷贝测试

测试代码演示

代码语言:java复制
package com.example.javase.se.array;

import java.util.Arrays;

/**
 * @Author ms
 * @Date 2023-11-14 21:11
 */
public class ArrCopyTest {

    public static void main(String[] args) {
        int[] srcArray = {1, 2, 3, 4, 5};
        int[] destArray = new int[5];
        System.arraycopy(srcArray, 0, destArray, 0, 5);
        System.out.println(Arrays.toString(destArray));
    }
}

  上面的代码将srcArray数组中的所有元素复制到destArray数组中,并在控制台输出destArray数组中的元素。输出结果为{1, 2, 3, 4, 5}。

测试结果

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

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这段代码演示了如何使用Java中的System.arraycopy()方法来复制一个数组。在这段代码中,首先定义了一个长度为5的int类型数组srcArray,同时定义了一个长度也为5的int类型数组destArray。接着使用System.arraycopy()方法复制srcArray数组到destArray数组中。

具体来说,System.arraycopy()方法的第一个参数是源数组,第二个参数是源数组中开始复制的位置,第三个参数是目标数组,第四个参数是目标数组中开始复制的位置,第五个参数是要复制的元素个数。所以这段代码中,从srcArray数组的第0个位置开始,复制5个元素到destArray数组中的第0个位置。

最后,使用Arrays.toString()方法将destArray数组转换为字符串并输出结果。在本例中,输出的结果为1, 2, 3, 4, 5,表示destArray数组中的元素已经成功地从srcArray数组中复制过来了。

数组克隆测试

测试代码演示

代码语言:java复制
package com.example.javase.se.array;

import java.util.Arrays;

/**
 * @Author ms
 * @Date 2023-11-14 21:11
 */
public class ArrCloneTest {

    public static void main(String[] args) {
        int[] srcArray = {1, 2, 3, 4, 5};
        int[] destArray = srcArray.clone();
        System.out.println(Arrays.toString(destArray));
    }
}

  上面的代码将srcArray数组克隆到destArray数组中,并在控制台输出destArray数组中的元素。输出结果为{1, 2, 3, 4, 5}。

测试结果

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

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这段代码实现了对一个整型数组进行克隆的操作。首先定义了一个数组 srcArray,它包含了 5 个整型元素。然后使用 clone() 方法对 srcArray 进行克隆,得到了一个新的数组 destArray,其元素与 srcArray 完全相同。

  最后,使用 Arrays.toString() 方法将 destArray 数组中的元素转换为字符串,并输出到控制台上,以便查看克隆是否成功。

  整个程序运行起来,控制台输出的内容应该是:[1, 2, 3, 4, 5]

全文小结

  在本文中,我们介绍了Java中的数组概念,以及数组拷贝和数组克隆的含义和用法。我们通过源代码解析,应用场景案例和优缺点分析等方面对它们进行深入探讨。最后,我们给出了类代码方法介绍和测试用例,并进行了全文小结和总结。

总结

  Java中的数组拷贝和数组克隆是比较基础的操作,在实际开发中也非常常见。熟练掌握它们的使用方法,有助于提高编程效率和代码质量。在使用数组拷贝和数组

... ...

文末

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

... ...

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

wished for you successed !!!

***

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

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

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

我正在参与我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞