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
2
abc
10
test2
1
2
abc
200
test2
结果分析:
第一个元素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内元素是一样的元素(只是引用了原数组元素的地址)。