Java复制数组的四种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRange()方法

摘要:
Java中有四种方法可以实现数组复制,即Arrays类的copyOf()方法和copyOfRange()方法,System类的arraycopy()方法以及Object类的clone()方法。使用Arrays类copyOfRange()方法完成数组复制的代码如下:importjava.util.Arrays;PublicclassTest20{publicstaticvoidmain{//定义长度为8{57,81,68,75,91,66,75,84}的数组int scores〔〕=newint〔〕;System.out.println;//循环通过{System.out.print;}//的源数组,将源数组的前五个元素复制到newScores数组intnewScores[]=数组中。copyOfRange;System.out.println;//循环遍历目标数组,即{System.out.print;}}}}的复制新数组。在上面的代码中,源数组得分包含8个元素。使用阵列。copyOfRange()方法将数组复制到长度为5的newScores数组,并截取scores数组的前5个元素。使用系统的代码。arraycopy()方法完成替换数组元素的功能如下:importja

所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。

在 Java 中实现数组复制有 4 种方法,分别为使用 Arrays 类的 copyOf() 方法和 copyOfRange() 方法、System 类的 arraycopy() 方法和 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() 方法完成数组复制的代码如下:

  1. import java.util.Arrays;
  2. public classTestl9
  3. {
  4. public static void main(String[] args)
  5. {
  6. //定义长度为 5 的数组
  7. int scores[]=new int[]{57,81,68,75,91};
  8. //输出源数组
  9. System.out.println("源数组内容如下:");
  10. //循环遍历源数组
  11. for(int i=0;i<scores.length;i++)
  12. {
  13. //将数组元素输出
  14. System.out.print(scores[i]+"");
  15. }
  16. //定义一个新的数组,将scores数组中的5个元素复制过来
  17. //同时留3个内存空间供以后开发使用
  18. int[] newScores=(int[])Arrays.copyOf(scores,8);
  19. System.out.println("复制的新数组内容如下:");
  20. //循环遍历复制后的新数组
  21. for(int j=0;j<newScores.length;j++)
  22. {
  23. //将新数组的元素输出
  24. System.out.print(newScores[j]+"");
  25. }
  26. }
  27. }


在上述代码中,由于源数组 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() 方法完成数组复制的代码如下:

  1. import java. util. Arrays;
  2. public classTest20
  3. {
  4. public static void main(String[] args)
  5. {
  6. //定义长度为8的数组
  7. int scores[]=new int[]{57,81,68,75,91,66,75,84};
  8. System.out.println("源数组内容如下:");
  9. //循环遍历源数组
  10. for(int i=0;i<scores.length;i++)
  11. {
  12. System.out.print(scores[i]+"");
  13. }
  14. //复制源数组的前5个元素到newScores数组中
  15. int newScores[]=(int[])Arrays.copyOfRange(scores,0,5);
  16. System.out.println("复制的新数组内容如下:");
  17. //循环遍历目标数组,即复制后的新数组
  18. for(int j=0;j<newScores.length;j++)
  19. {
  20. System.out.print(newScores[j]+"");
  21. }
  22. }

}

在上述代码中,源数组 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() 方法来完成替换数组元素功能的代码如下:

  1. import java.util.Arrays;
  2. public classTest21
  3. {
  4. public static void main(String[] args)
  5. {
  6. //定义源数组,长度为8
  7. int scores[]=new int[]{100,81,68,75,91,66,75,100};
  8. //定义目标数组
  9. int newScores[]=new int[]{80,82,71,92,68,71,87,88,81,79,90,77};
  10. System.out.println("源数组中的内容如下:");
  11. //遍历源数组
  12. for(int i=0;i<scores.length;i++)
  13. {
  14. System.out.print(scores[i]+"");
  15. }
  16. System.out.println("目标数组中的内容如下:");
  17. //遍历目标数组
  18. for(int j=0;j<newScores.length;j++)
  19. {
  20. System.out.print(newScores[j]+"");
  21. }
  22. System.arraycopy(scores,0,newScores,2,8);
  23. //复制源数组中的一部分到目标数组中
  24. System.out.println("替换元素后的目标数组内容如下:");
  25. //循环遍历替换后的数组
  26. for(int k=0;k<newScores.length;k++)
  27. {
  28. System.out.print(newScores[k]+"");
  29. }
  30. }
  31. }


在该程序中,首先定义了一个包含有 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()


示例语句如下:

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


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

例 4

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

  1. import java.util.Arrays;
  2. public classTest22
  3. {
  4. public static void main(String[] args)
  5. {
  6. //定义源数组,长度为8
  7. int scores[]=new int[]{100,81,68,75,91,66,75,100};
  8. System.out.println("源数组中的内容如下:");
  9. //遍历源数组
  10. for(int i=0;i<scores.length;i++)
  11. {
  12. System.out.print(scores[i]+"");
  13. }
  14. //复制数组,将Object类型强制转换为int[]类型
  15. int newScores[]=(int[])scores.clone();
  16. System.out.println("目标数组内容如下:");
  17. //循环遍历目标数组
  18. for(int k=0;k<newScores.length;k++)
  19. {
  20. System.out.print(newScores[k]+"");
  21. }
  22. }
  23. }


在该程序中,首先定义了一个长度为 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 数组的元素是相同的。

免责声明:文章转载自《Java复制数组的四种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRange()方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cocos_js写文件WebService如何根据WSDL文件转换成本地的C#类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

微信分享回调

在我们的项目中,我曾经判断用户是否通过微信分享了文章或内容。在确认用户通过微信分享了文章或内容后,我向用户添加了相应的分数。...

lstm与bilstm

背景学习和整理lstm和bilstm的理论知识。对于有序数据,bilstm具有数据信息的长、短存储功能。bilstm:它是前lstm和后lstm的组合。为什么需要lstm?它可以更好地捕捉远距离的依赖性。通过培训,你可以了解哪些信息需要记住,哪些信息需要忘记;我不认为他喜欢“否定”,即句子的情感分析是贬义的。“lstm建模有一个问题,它不能从后面到前面对信息...

Android Exception 10(server)' ~ Channel is unrecoverably broken and will be disposed!)

08-1119:22:35.028:W/MemoryDealer(2123):madvise(0x43e1600012288,MADV_REMOVE)返回操作不支持传输端点08-1119:22-35.038:W/InputDispatcher(2714):channel'4236b890com.tongyan.activi...

codeforces 765 F Souvenirs 线段树+set

问题的含义:多个查询的间隔中两个数字之差的绝对值的最小值:可以根据查询的l对脱机查询进行排序,并且可以从r到l进行反向查询,并且间隔i+1到n的每次更新都可以确保此更新不会影响下一次和后续更新。因为当两个区间相互覆盖时,具有较小l的区间的值必须小于或等于另一个区间,因此可以绘制一个图来理解。...

C#探秘系列(十)WPF:打开文件选择器选择文件并保存

//此为点击按钮的监听事件,点击按钮弹出文件选择器privatevoidimageButton_Click(objectsender,RoutedEventArgse){vardialog=newOpenFileDialog();dialog.Filter=".jpg|*.jpg|.png|*.png|.jpeg|*.jpeg";if(dialog.Show...

bootstrap删除模态框弹出并询问是否删除【通用删除模态框】

divclass=“模态对话框”&gt;divclass=“modal header”&gt;spanaria hidden=“true”&gt;h4class=“模态标题”&gt;divclass=“modal body”&gt;divclass=“模态页脚”&gt;...