所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。本文主要介绍关于 Java 里面的数组复制(拷贝)的几种方式和用法。在 Java 中实现数组复制分别有以下 4 种方法:

  1. Arrays 类的 copyOf() 方法

  2. Arrays 类的 copyOfRange() 方法

  3. System 类的 arraycopy() 方法

  4. Object 类的 clone() 方法

下面来详细介绍这 4 种方法的使用。

使用 copyOf() 方法和 copyOfRange() 方法

Arrays 类的 copyOf() 方法与 copyOfRange() 方法都可实现对数组的复制。copyOf() 方法是复制数组至指定长度,copyOfRange() 方法则将指定数组的指定长度复制到一个新数组中。

1. 使用 copyOf() 方法对数组进行复制

Arrays 类的 copyOf() 方法的语法格式如下:

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

其中,srcArray 表示要进行复制的数组,length 表示复制后的新数组的长度。使用这种方法复制数组时,默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。注意:目标数组如果已经存在,将会被重构。

例 1

假设有一个数组中保存了 5 个成绩,现在需要在一个新数组中保存这 5 个成绩,同时留 3 个空余的元素供后期开发使用。使用 Arrays 类的 CopyOf() 方法完成数组复制的代码如下:

import java.util.Arrays;public class Test19{    public static void main(String[] args) {        // 定义长度为 5 的数组        int scores[] = new int[]{57,81,68,75,91};        // 输出原数组        System.out.println("原数组内容如下:");        // 循环遍历原数组        for(int i=0;i            // 将数组元素输出            System.out.print(scores[i]+"\t");        }        // 定义一个新的数组,将 scores 数组中的 5 个元素复制过来        // 同时留 3 个内存空间供以后开发使用        int[] newScores = (int[])Arrays.copyOf(scores,8);        System.out.println("\n复制的新数组内容如下:");        // 循环遍历复制后的新数组        for(int j=0;j            // 将新数组的元素输出            System.out.print(newScores[j]+"\t");        }    }}

在上述代码中,由于原数组 scores 的长度为 5,而要复制的新数组 newScores 的长度为 8,因此在将原数组中的 5 个元素复制完之后,会采用默认值填充剩余 3 个元素的内容。

因为原数组 scores 的数据类型为 int,而使用 Arrays.copyOf(scores,8) 方法复制数组之后返回的是 Object[] 类型,因此需要将 Object[] 数据类型强制转换为 int[] 类型。同时,也正因为 scores 的数据类型为 int,因此默认值为 0。运行的结果如下所示。

原数组内容如下:
57 81 68 75 91
复制的新数组内容如下:
57 81 68 75 91 0 0 0

2. 使用 CopyOfRange() 方法对数组进行复制

Arrays 类的 CopyOfRange() 方法是另一种复制数组的方法,其语法形式如下:

Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)

其中:

  • srcArray 表示原数组。

  • startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。

  • endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充。

注意:目标数组如果已经存在,将会被重构。

例 2

假设有一个名称为 scores 的数组其元素为 8 个,现在需要定义一个名称为 newScores 的新数组。新数组的元素为 scores 数组的前 5 个元素,并且顺序不变。使用 Arrays 类 copyOfRange() 方法完成数组复制的代码如下:

public class Test20 {    public static void main(String[] args) {        // 定义长度为8的数组        int scores[] = new int[] { 57, 81, 68, 75, 91, 66, 75, 84 };        System.out.println("原数组内容如下:");        // 循环遍历原数组        for (int i = 0; i < scores.length; i++) {            System.out.print(scores[i] + "\t");        }        // 复制原数组的前5个元素到newScores数组中        int newScores[] = (int[]) Arrays.copyOfRange(scores, 0, 5);        System.out.println("\n复制的新数组内容如下:");        // 循环遍历目标数组,即复制后的新数组        for (int j = 0; j < newScores.length; j++) {            System.out.print(newScores[j] + "\t");        }    }}

在上述代码中,原数组 scores 中包含有 8 个元素,使用 Arrays.copyOfRange() 方法可以将该数组复制到长度为 5 的 newScores 数组中,截取 scores 数组的前 5 个元素即可。

该程序运行结果如下所示。

原数组内容如下:
57 81 68 75 91 66 75 84
复制的新数组内容如下:
57 81 68 75 91

使用 arraycopy() 方法

arraycopy() 方法位于 java.lang.System 类中,其语法形式如下:

System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)

其中,srcArray 表示原数组;srcIndex 表示原数组中的起始索引;destArray 表示目标数组;destIndex 表示目标数组中的起始索引;length 表示要复制的数组长度。使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,同时 length+destIndex 必须小于等于 destArray.length。注意:目标数组必须已经存在,且不会被重构,相当于替换目标数组中的部分元素。

例 3

假设在 scores 数组中保存了 8 名学生的成绩信息,现在需要复制该数组从第二个元素开始到结尾的所有元素到一个名称为 newScores 的数组中,长度为 12。scores 数组中的元素在 newScores 数组中从第三个元素开始排列。使用 System.arraycopy() 方法来完成替换数组元素功能的代码如下:

public class Test21 {    public static void main(String[] args) {        // 定义原数组,长度为8        int scores[] = new int[] { 100, 81, 68, 75, 91, 66, 75, 100 };        // 定义目标数组        int newScores[] = new int[] { 80, 82, 71, 92, 68, 71, 87, 88, 81, 79, 90, 77 };        System.out.println("原数组中的内容如下:");        // 遍历原数组        for (int i = 0; i < scores.length; i++) {            System.out.print(scores[i] + "\t");        }        System.out.println("\n目标数组中的内容如下:");        // 遍历目标数组        for (int j = 0; j < newScores.length; j++) {            System.out.print(newScores[j] + "\t");        }        System.arraycopy(scores, 0, newScores, 2, 8);        // 复制原数组中的一部分到目标数组中        System.out.println("\n替换元素后的目标数组内容如下:");        // 循环遍历替换后的数组        for (int k = 0; k < newScores.length; k++) {            System.out.print(newScores[k] + "\t");        }    }}

在该程序中,首先定义了一个包含有 8 个元素的 scores 数组,接着又定义了一个包含有 12 个元素的 newScores 数组,然后使用 for 循环分别遍历这两个数组,输出数组中的元素。最后使用 System.arraycopy() 方法将 newScores 数组中从第三个元素开始往后的 8 个元素替换为 scores 数组中的 8 个元素值。

该程序运行的结果如下所示。

原数组中的内容如下:
100 81 68 75 91 66 75 100
目标数组中的内容如下:
80 82 71 92 68 71 87 88 81 79 90 77
替换元素后的目标数组内容如下:
80 82 100 81 68 75 91 66 75 100 90 77

注意:在使用 arraycopy() 方法时要注意,此方法的命名违背了 Java 的命名惯例。即第二个单词 copy 的首字母没有大写,但按惯例写法应该为 arrayCopy。请读者在使用此方法时注意方法名的书写。

使用 clone() 方法

clone() 方法也可以实现复制数组。该方法是类 Object 中的方法,可以创建一个有单独内存空间的对象。因为数组也是一个 Object 类,因此也可以使用数组对象的 clone() 方法来复制数组。clone() 方法的返回值是 Object 类型,要使用强制类型转换为适当的类型。其语法形式比较简单:

array_name.clone()

示例语句如下:

int[] targetArray=(int[])sourceArray.clone();

注意:目标数组如果已经存在,将会被重构。

例 4

有一个长度为 8 的 scores 数组,因为程序需要,现在要定义一个名称为 newScores 的数组来容纳 scores 数组中的所有元素,可以使用 clone() 方法来将 scores 数组中的元素全部复制到 newScores 数组中。代码如下:

public class Test22 {    public static void main(String[] args) {        // 定义原数组,长度为8        int scores[] = new int[] { 100, 81, 68, 75, 91, 66, 75, 100 };        System.out.println("原数组中的内容如下:");        // 遍历原数组        for (int i = 0; i < scores.length; i++) {            System.out.print(scores[i] + "\t");        }        // 复制数组,将Object类型强制转换为int[]类型        int newScores[] = (int[]) scores.clone();        System.out.println("\n目标数组内容如下:");        // 循环遍历目标数组        for (int k = 0; k < newScores.length; k++) {            System.out.print(newScores[k] + "\t");        }    }}

在该程序中,首先定义了一个长度为 8 的 scores 数组,并循环遍历该数组输出数组中的元素,然后定义了一个名称为 newScores 的新数组,并使用 scores.clone() 方法将 scores 数组中的元素复制给 newScores 数组。最后循环遍历 newScores 数组,输出数组元素。

程序运行结果如下所示。

原数组中的内容如下:
100 81 68 75 91 66 75 100
目标数组内容如下:
100 81 68 75 91 66 75 100

从运行的结果可以看出,scores 数组的元素与 newScores 数组的元素是相同的。注意:以上几种方法都是浅拷贝(浅复制)。浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变。

arraycopy用法_Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan...相关推荐

  1. php冒泡 插入选择 排序,说说PHP数组的三种排序(冒泡/选择/插入)方法

    说说PHP数组的三种排序(冒泡/选择/插入)方法 PHP #数组 #排序 #冒泡 #选择 #插入2012-05-30 10:17 一.冒泡排序法 说明:找到最大的数,排列到最后面,然后继续找 例: $ ...

  2. Java创建数组的三种方式 (以及length方法是否能获取数组中元素的个数)

    Java创建数组的三种方法 import java.util.Arrays; public class Sum { public static void main(String[] args){ in ...

  3. java 数组排序论文_Java中运用数组的四种排序方法

    标签: <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; 2 public class Test2{ public static void m ...

  4. Java中运用数组的四种排序方法_JAVA中运用数组的四种排序方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 快速排序 public class TestMain { public static void main(String[] args) { Integer ...

  5. vue 拷贝 数组_vue源码中值得学习的方法

    最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大家对深入学习js有所帮助.如果大家都能一眼看懂这些函数,说明技术还是不错的哦. 1. 数据类型判断 Objec ...

  6. java 如何初始化数组_java中初始化数组的三种方式分别是什么

    三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 3.默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值 (视频教程推荐:java视频) 我们来看一下具体代码:publ ...

  7. java将字符串遍历成数组_Java遍历字符串数组的几种方法

    [POJ2699]The Maximum Number of Strong Kings(二分,最大流) 题意: 有n个队伍,两两都有比赛 知道最后每支队伍获胜的场数 求最多有多少队伍,他们战胜了所有获 ...

  8. 1.13 复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan

    所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制.本文主要介绍关于 Java 里面的数组复制(拷贝)的几种方式和用法. 在 Java 中实现数组复制分别有以下 4 种方法: Arrays 类 ...

  9. java arraycopy 参数_java 数组复制:System.arrayCopy 深入解析

    先看ArrayList源码中数组复制的代码: 其实ArrayList 就是一个数组的形式存放数据的.没有高深的地方. 他的性能在于他的索引能力,正因为他是数组形式,所以索引元素的时候他表现得非常的快速 ...

最新文章

  1. Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结...
  2. Leetcode445 两数相加||(单链表)
  3. 成人python培训_B2B优选:成人编程爱好者学习
  4. 计算机三级 数据库技术 学习笔记
  5. Delphi配置系统未能初始化
  6. Ubuntu12.04 耳机无声 扬声器有声的解决
  7. Cortex-A 架构
  8. Google Earth Engine(GEE)计算热度(LST)
  9. 网络安全体系与网络安全模型
  10. 微信支付API3 APP【统一下单 APIV3】
  11. 虚拟存储技术-virtual memory technologies
  12. 以鸿蒙为景柱1009无标题,鸿蒙的意思
  13. 计算机与信息科学学院英语,湖南工学院计算机与信息科学学院英语协会
  14. Android studio 报错Multiple annotations of type `dalvik.annotation.EnclosingClass`
  15. 7-3 接话茬 (100分)(简洁易懂的代码含思路分析)
  16. Python实现批量复制文件
  17. 【转】25.windbg-!gle、g(错误码、g系列)
  18. 最新可用分享网摘网址大全
  19. kubelet启动失败问题
  20. Ubuntu16成功安装QQ2012国际版(wine1.6.2)

热门文章

  1. mSystems: 南土所褚海燕组揭示了大空间尺度下空间比季节对土壤微生物群落的影响大
  2. “一不小心”成为大佬:Rob Knight 的传奇故事
  3. 多快好省的宏基因组研究技巧 — 资深专家分享
  4. QIIME 2用户文档. 11元数据Metadata(2019.7)
  5. 鱼和熊掌可以兼得! 天昊生物微生物16S扩增子绝对定量测序检测新模式创双赢!...
  6. MMinte:预测微生物群体内代谢物互作
  7. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字
  8. plotly可视化绘制多图(multiplot)
  9. python计算时间差
  10. linux bash输入输出重定向