java.util.ArrayList.clone()是浅层拷贝

java.util.ArrayList.clone()是浅层拷贝。那么什么是浅拷贝呢?对于ArrayList变量就是指:两个变量指示内存中的地址是不一样的,但是变量中的元素指向同一个元素。深层拷贝是指,不仅仅变量指示的内存地址不一样,而且变量中的各个元素所指地址也是不一样的。如图:
这里写图片描述
具体内容这篇文章有介绍http://www.yiibai.com/java/util/arraylist_clone.html。下面介绍我遇到的一个例子。
这里定义一个ArrayList泛型为Integer类型的变量a1,将之克隆给a2。之后将a2中的某些元素进行移除,请问移除后的a1和a2是否相同???代码如下

        ArrayList<Integer> a1 = new ArrayList<Integer>();
        a1.add(1);
        a1.add(10);
        a1.add(13);
        a1.add(56);
        a1.add(199);
        ArrayList<Integer> a2 = (ArrayList<Integer>) a1.clone();

        System.out.println("删除之前");
        System.out.println(a1);
        System.out.println(a2);

        a2.remove(3);
        a2.remove(1);

        System.out.println("删除之后");
        System.out.println(a1);
        System.out.println(a2);

结果是如下:

删除之前
[1, 10, 13, 56, 199]
[1, 10, 13, 56, 199]
删除之后
[1, 10, 13, 56, 199]
[1, 13, 199]

第二段代码如下:

        ArrayList<Integer> a1 = new ArrayList<Integer>();
        a1.add(1);
        a1.add(10);
        a1.add(13);
        a1.add(56);
        a1.add(199);
        ArrayList<Integer> a2 = new ArrayList<Integer>();
        a2.add(21);
        a2.add(20);
        a2.add(23);
        a2.add(26);
        a2.add(299);
        ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
        a.add(a1);a.add(a2);

        ArrayList<ArrayList<Integer>> b = (ArrayList<ArrayList<Integer>>) a.clone();
        System.out.println("删除之前");
        System.out.println(a);
        System.out.println(b);

        a2.remove(3);
        a2.remove(1);

        System.out.println("删除之后");
        System.out.println(a);
        System.out.println(b);

运行结果:

删除之前
[[1, 10, 13, 56, 199], [21, 20, 23, 26, 299]]
[[1, 10, 13, 56, 199], [21, 20, 23, 26, 299]]
删除之后
[[1, 10, 13, 56, 199], [21, 23, 299]]
[[1, 10, 13, 56, 199], [21, 23, 299]]

相信两个例子已经非常明显的揭露了ArrayList的API函数clone是浅层拷贝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章