一维数组中的四种拷贝

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

1.for循环拷贝

2.clone拷贝

3.System.arraycopy拷贝

4.Arrays.copyof拷贝

这里我们先建立个浅拷贝的概念:简单来说就是拷贝后两个变量指向同一片地址

数组属于引用类型,自身携带的是储存值得地址

接下来让我们从基本类型的数组和引用类型的数组来分别讲述

数组属于引用类型

1.for循环

一维数组中的四种拷贝_第1张图片

这是输出的结果

一维数组中的四种拷贝_第2张图片

这里定义通过for循环把array拷贝给array2,然后变化array中1号位置的值发现array2

对应位置的值没有变,说明两者指向的不是同一块地址。

我们看一下他在内部是怎么拷贝的

一维数组中的四种拷贝_第3张图片

可以看出两者对应的地址并不是同一块,所以修改array2数组的值,并不影响array中

的值。然后我们换用引用类型的数组来试试

一维数组中的四种拷贝_第4张图片

这里我们定义一个类,用来定义引用类型的数组

一维数组中的四种拷贝_第5张图片


这里我们也通过for循环拷贝,show2是引用类型的打印方法,先是拷贝后的打印,然

后是t2中第一个元素后的打印,让我们来看一下结果

一维数组中的四种拷贝_第6张图片

发现结果t1数组中的第一个元素也发生了变化,也变成了1000,说明这两者指向同一

片地址。所以for循环的引用类型的拷贝属于浅拷贝。


2.clone拷贝

一维数组中的四种拷贝_第7张图片

打印结果如下

一维数组中的四种拷贝_第8张图片

array的一号位置的值发生改变而array2一号位置却未变,说明clone的数组拷贝后两

者对应的不是同一块地址。再看引用类数组

一维数组中的四种拷贝_第9张图片

打印结果

一维数组中的四种拷贝_第10张图片

看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一

块地址,所以clone的引用类型的数组也是浅拷贝。再用图示来说明引用数组中他们是

如何拷贝的

一维数组中的四种拷贝_第11张图片

因为这里是引用数组,数组中存放的是引用对象的地址,所以array2拷贝array时,获

得的是array所引用对象的地址,两者对应同一块地址,当任意数组中地址中的值改变

时,两个数组对应的值都发生改变。


3.System.arraycopy拷贝

我们先了解一下System.arraycopy是怎么使用的,System.arraycopy(Object 

src,int srcPos, Object dest,int destPos)

src : 源数组

srcPos:源数组的开始位置 0 开始拷贝的位置

dest:拷贝到目标数组

destPos:拷贝到目标数组的位置

一维数组中的四种拷贝_第12张图片

打印结果

一维数组中的四种拷贝_第13张图片

看出改变array一号位置的地址,array2一号位置没有改变,说明两者指向的是不是同

一块地址,再来看引用类类型

一维数组中的四种拷贝_第14张图片

打印结果

一维数组中的四种拷贝_第15张图片

看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一

块地址,所以System.arraycopy对引用类型的数组也是浅拷贝。

4.Arrays.copyof拷贝

首先让我们先了解一下它的用法

Arrays.copyOf(original, newLength);

original:原始数组

newLength:新的数组长度

一维数组中的四种拷贝_第16张图片

打印结果

一维数组中的四种拷贝_第17张图片

看出改变array一号位置的地址,array2一号位置不发生改变,说明两者指向的是不同

地址。继续看引用类数组

一维数组中的四种拷贝_第18张图片

打印结果

一维数组中的四种拷贝_第19张图片

看出改变array一号位置的地址,array2一号位置也一样改变,说明两者指向的是同一

块地址,所以Arrays.copyOf对于引用类型的数组也是浅拷贝。


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

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

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


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

你可能感兴趣的:(java)