赞
踩
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),又称为复杂数据类型
深拷贝:把对象当中的所有属性,拷贝给新的对象。并且拷贝内存地址。(深拷贝前后两个对象互不影响。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。