对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去,这样的复制在C\C++中叫做浅拷贝。
同样话不多说,上代码。
一个典型的错误例子(test2.java): ------------------------------------------------------------------------------- public class test2 { public static void main (String [] args) { int [] arr1 = {1,2,3,4,5}; //注意:这里不是数组的复制,而是地址复制,即arr1与arr2指向同一块地址空间 int [] arr2 = arr1; arr2[2]=10; for(int num : arr1) { //输出结果为:1 2 10 4 5 System.out.print(num+"\t"); } } } -------------------------------------------------------------------------------
那么既然已经知道了错误的原因,那么就能从根源上,解决这个问题了,这里提供两种方案。
第一种方案:
1 一种解决方案(test3.java): 2 3 ------------------------------------------------------------------------------- 4 //数组的复制 5 6 public class test3 7 { 8 public static void main (String [] args) 9 { 10 int [] a = {1,2,3,4,5}; 11 12 int len = arr1.length; 13 int [] arr2 = new int [len]; 14 for(int i=0 ; i<len ; i++) 15 { 16 arr2[i] = arr1[i]; 17 } 18 19 //上面的写法相当于下面这个方式 20 //int [] arr2 = (int[])arr1.clone(); 21 22 arr2[2] = 10; 23 24 for(int num : arr1) 25 { 26 //打印结果:1 2 3 4 5 27 System.out.print(num+"\t"); 28 } 29 30 System.out.println(); 31 32 for(int num : arr2) 33 { 34 //打印结果为:1 2 10 4 5 35 System.out.print(num+"\t"); 36 } 37 } 38 }
第二种方案,详见下篇文章。
原文:https://www.cnblogs.com/zglbt/p/8934441.html