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

结果分析:

  1. 第一个元素int,在数组2对其修改,两个数组都不受影响;

  2. 第4个元素Integer,改变了数组2引用的Integer(数组1的引用不受影响),所以数组2改变,数组1不变化。

  3. 第五个元素说明问题:Test对象,从数组2取出Test对象,并改变Test的属性,发现数组1和数组2都改变了,说明数组1,和2使用的是同一个Test对象,也就是copy方法只是引用了原数组的对象。

  4. ArrayList.clone()方法对elementData操作时,使用了Arrays.copy()方法,所以clone前后list内元素是一样的元素(只是引用了原数组元素的地址)。