1. 程式人生 > >list 集合複製總結

list 集合複製總結

         結果:[a, b, c, d]

                    [a, b, c] 

            說明:通過addAll的方法複製一個集合,新的集合也是單獨開闢了一個記憶體空間。當然新集合的操作不影響源集合。

     方法三:

                 List l = new ArrayList();  

l.add("a");  

l.add("b");  

l.add("c");  

Listl2 = new ArrayList(Arrays.asList(new Object[l.size()]));  

Collections.copy(l2, l);  

l2.add("d");  

System.out.println(l2);  

System.out.println(l);

        結果:[a, b, c, d]

                   [a, b, c]

        說明:使用集合的工具類的靜態方法Collections.copy(List desList, List srcList)的方式複製集合,得到的也是一個位於記憶體中不同空間的副本。

   注意這種方式,如果你直接這樣寫:

List l2 = new ArrayList();  

 Collections.copy(l2, l);

會報錯:java.lang.IndexOutOfBoundsException: Source does not fit in dest

原因是你使用該方法時,會先比較目標集合和源集合的size,而你直接new ArrayList();還沒來得及複製,目標集合的size為0,和源集合的size不一樣,就會報錯。注:new ArrayList(int size)定義的是該集合的的容納能力為size,並不是說目標集合中就有了size個元素。所以要這樣寫:new ArrayList(Arrays.asList(new Object[l.size()]));

   方法四:

List l = new ArrayList();  

l.add("a");  

l.add("b");  

l.add("c");  

List l2 = l;  

l2.add("d");  

System.out.println(l2);  

System.out.println(l);

   結果:[a, b, c, d]

       [a, b, c, d]

說明:這種方式只是定義了另一個引用,但是指向的內容還是源集合指向的內容。所以對其修改當然會影響源集合了。 

對Map, Set的複製拷貝方式研究同理,這裡不再贅述。