因为数组是引用类型,所以将一个数组变量赋值给另一个数组变量后,这两个引用会指向同一个数组对象,因此对一个数组进行改变会影响到另一个数组的结构。
而复制数组会创建一个数组的副本(浅表副本)。两种方式:1、实例方法:a.Clone( ); 2、静态方法:Array.Copy(...);
1、 数组的元素是值类型
对复制数组或原数组的修改不会影响到另一个数组,因为值类型的复制只是拷贝原来的值,会重新分配内存。如下:
int [] array1 = {1,2};
int [] array2 = (int [])array1.Clone();
// Clone() 返回的是object 类型,需要进行类型转换
2、 数组的元素是引用类型
对复制数组或原数组中元素的修改会影响到另一个数组,因为数组的元素是引用类型,复制元素时只是复制了引用。如下:
// Person 类,有一个构造函数,初始化里面的姓名字段
Person [] array1 = {new Person("a"),new Person("b")};
Person [] array2 = (Person[]) array1.Clone();
另一种方法:Array.Copy(...) 比较灵活,可以部分复制
如下所示:需要原数组,目标数组,默认从0开始,复制 length长度的值,也可以自定义原数组的起始下标,目标数组的起始下标。
public static void Copy(Array sourceArray,Array destinationArray,int length)
public static void Copy(Array sourceArray,int sourceIndex,Array destinationArray,int destinationIndex,int length)
还有另外两个重载方法,不过是将上面两个方法的int 类型变成 long 类型。
注意:目标数组的阶数要与原数组保持一致,复制长度要小于等于两个数组的长度最小值。
int[] aa = {1,3,4,6};
int[] bb = new int [8];
Array.Copy(aa,bb,aa.Length);
// 输出bb数组,结果是: 1,3,4,6,0,0,0,0
注意:
1.下标需要小于数组的长度
2.(复制长度 <= aa.length - 起始下标1)
3.(复制长度 <= bb.length - 起始下标2)
int[] aa = {1,3,4,6};
int[] bb = new int [8];
Array.Copy(aa,1,bb,2,3);
// 从aa数组的下标1处开始复制,复制到bb数组下标2开始的位置,复制长度是3
// 输出bb数组,结果是: 0,0,3,4,6,0,0,0