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

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


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

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

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


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

相关文章: