这节我们来说数组中四种拷贝方式
1.for循环拷贝
2.clone拷贝
3.System.arraycopy拷贝
4.Arrays.copyof拷贝
这里我们先建立个浅拷贝的概念:简单来说就是拷贝后两个变量指向同一片地址。
数组属于引用类型,自身携带的是储存值得地址。
接下来让我们从基本类型的数组和引用类型的数组来分别讲述
数组属于引用类型
1.for循环
这是输出的结果
这里定义通过for循环把array拷贝给array2,然后变化array中1号位置的值发现array2
对应位置的值没有变,说明两者指向的不是同一块地址。
我们看一下他在内部是怎么拷贝的
可以看出两者对应的地址并不是同一块,所以修改array2数组的值,并不影响array中
的值。然后我们换用引用类型的数组来试试
这里我们定义一个类,用来定义引用类型的数组
这里我们也通过for循环拷贝,show2是引用类型的打印方法,先是拷贝后的打印,然
后是t2中第一个元素后的打印,让我们来看一下结果
发现结果t1数组中的第一个元素也发生了变化,也变成了1000,说明这两者指向同一
片地址。所以for循环的引用类型的拷贝属于浅拷贝。
2.clone拷贝
打印结果如下
array的一号位置的值发生改变而array2一号位置却未变,说明clone的数组拷贝后两
者对应的不是同一块地址。再看引用类数组
打印结果
看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一
块地址,所以clone的引用类型的数组也是浅拷贝。再用图示来说明引用数组中他们是
如何拷贝的
因为这里是引用数组,数组中存放的是引用对象的地址,所以array2拷贝array时,获
得的是array所引用对象的地址,两者对应同一块地址,当任意数组中地址中的值改变
时,两个数组对应的值都发生改变。
3.System.arraycopy拷贝
我们先了解一下System.arraycopy是怎么使用的,System.arraycopy(Object
src,int srcPos, Object dest,int destPos)
src : 源数组
srcPos:源数组的开始位置 0 开始拷贝的位置
dest:拷贝到目标数组
destPos:拷贝到目标数组的位置
打印结果
看出改变array一号位置的地址,array2一号位置没有改变,说明两者指向的是不是同
一块地址,再来看引用类类型
打印结果
看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一
块地址,所以System.arraycopy对引用类型的数组也是浅拷贝。
4.Arrays.copyof拷贝
首先让我们先了解一下它的用法
Arrays.copyOf(original, newLength);
original:原始数组
newLength:新的数组长度
打印结果
看出改变array一号位置的地址,array2一号位置不发生改变,说明两者指向的是不同
地址。继续看引用类数组
打印结果
看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一
块地址,所以Arrays.copyOf对于引用类型的数组也是浅拷贝。
四种数组拷贝方法及基本就是这样。
总结一下:上述的四种方法在正常数组中四种拷贝方式,都没有将地址赋给要拷贝的
数组,但是在引用类数组中,都是浅拷贝,拷贝后的数组和源数组指向同一片地址。