当前位置: 首页 > >

一维数组中的四种拷贝

发布时间:

这节我们来说数组中四种拷贝方式


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对于引用类型的数组也是浅拷贝。




四种数组拷贝方法及基本就是这样。


总结一下:上述的四种方法在正常数组中四种拷贝方式,都没有将地址赋给要拷贝的


数组,但是在引用类数组中,都是浅拷贝,拷贝后的数组和源数组指向同一片地址。



(新手上路,如有错误请多多指教,谢谢。)



友情链接: