Java复制数组(深拷贝,浅拷贝)

1.Object.clone()

   简单直接,只能对源数组完整地复制

        此方法是深拷贝,也就是如果clone 那么clone 的新数组修改不会影响老数组,但是能使用该方法为基本数据类型加上string (String 有final修饰,不可变)基本数据类型包括(byte,short,int,long,dubbo,float,boolean,char)

示例(以int为例)

int[] a1 = {2,3,4};
int[] a2 = a1.clone();
 
a1[0] = 8;
System.out.println(Arrays.toString(a1));   //[8,3,4]
System.out.println(Arrays.toString(a2));   //[2,3,4]

2.Arrays.copyOf(T[] original, int newLength)

   可以只复制源数组中部分元素,但复制的起始位置固定为0

3.Arrays.copyOfRange(T[] original, int from, int to)

   可以指定复制的起始位置

4.System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

   复杂,但可以将源数组中的部分元素复制到目标数组的指定位置(此方法最灵活,可实现上述1、2、3的功能)

其实23底层还是System.arraycopy

(1)Arrays.copyOf(T[] orignial,int newLength)和System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
当数组为一维数组,并且元素是基本类型、String、包装类型时都是深拷贝,此时复制之后的数组与原数组没有任何关系,修改两个数组中任意一个都不会对另外一个产生影响;元素是其他类型时是浅拷贝。
(2)当复制的数组是多维数组或者元素为对象的一维数组时,副本数组的元素一旦被修改,原数组的元素也会被同步修改,此时数组中的元素实际在堆中只有一份,但是每个元素都有两个引用(也就是说原数组和副本数组引用的是同一个对象),此时是浅拷贝

5.for循环

代码灵活,但效率低

1.浅拷贝

拷贝可以看做是赋值

浅拷贝:把对象当中“最外层”的属性,拷贝给新的对象。在拷贝的过程中,如果属性的值是简单数据类型,可直接拷贝给新的对象;若果是对象数据类型,只是把原来对象的内存地址拷贝给新的对象(在浅拷贝中,如果数据类型是对象数据类型,在拷贝过程中,其中一个对象改变了内存地址,另一个对象也会受到影响)

2.深拷贝

数据的类型有:(1)简单数据类型(number、string、boolean、null、undefined),又称为基本数据类型。简单的数据类型可以直接存储在栈(stack)中。(2)对象数据类型(object),又称为复杂数据类型
深拷贝:把对象当中的所有属性,拷贝给新的对象。并且拷贝内存地址。(深拷贝前后两个对象互不影响。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值