copy方法是浅拷贝还是深拷贝?
结论是:只是复制了引用地址,数组内的对象还是和旧数组一样的
代码如下:
/**
* @author wqf **/
public class TestArrayCopy { public static void main(String[] args) { Test t1 = new Test("test1"); Object[] src = {1,2,"abc",new Integer(10),t1}; Object[] dest = Arrays.copyOf(src,5);
int i = (int)dest[0];
i = 3;dest[3] = new Integer(200);
Test tt = (Test)dest[4];
tt.setName("test2");print(src); print(dest); } private static void print(Object[] args){ for(Object o:args){ System.out.println(o); } } private static class Test{ String name; public Test(String name){ this.name = name; } public String toString(){ return this.name; } public void setName(String name){ this.name = name; } }}
print结果:
1
2abc10test21
2abc200test2结果分析:
第一个元素int,在数组2对其修改,两个数组都不受影响;
第4个元素Integer,改变了数组2引用的Integer(数组1的引用不受影响),所以数组2改变,数组1不变化。
第五个元素说明问题:Test对象,从数组2取出Test对象,并改变Test的属性,发现数组1和数组2都改变了,说明数组1,和2使用的是同一个Test对象,也就是copy方法只是引用了原数组的对象。
ArrayList.clone()方法对elementData操作时,使用了Arrays.copy()方法,所以clone前后list内元素是一样的元素(只是引用了原数组元素的地址)。