一维数组中的四种拷贝

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

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


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

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

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


(新手上路,如有错误请多多指教,谢谢。)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值