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