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是淺層拷貝。

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