1、使用構造方法new ArrayList<>(srcList):
List<User>srcList = new ArrayList<>();
for(int i=0;i<3;i++) {
Useru = new User(Long.parseLong(i+""),"test"+i);
srcList.add(u);
}
System.out.println("src:");
System.out.println(srcList.toString());
List<User>desList = new ArrayList<>(srcList);
System.out.println("desc:");
System.out.println(desList.toString());
2、使用Collections.copy(des, src)方法:
當如下使用Collections.copy方法時,有可能會報IndexOutOfBoundsException異常。
Listdes1 = new ArrayList( 3 );
Collections.copy(des1,src1);
當時我怎麼想都想不明白為什麼,明明已經設定了長度為3,為什麼還會出錯。
後來列印出des1.size()才知道des1的長度為0;3表示的是這個List的容納能力為3,並不是說des1中就有了3個元素。查看api才知道,它的capacity(容納能力大小)可以指定(最好指定)。而初始化時size的大小永遠預設為0,只有在進行add和remove等相關操作時,size的大小才變化。然而進行copy()時候,首先做的是將desc1的size和src1的size大小進行比較,只有當desc1的 size大於或者等於src1的size時才進行拷貝,否則拋出IndexOutOfBoundsException異常。通過下面方式解決:
1)Collections.addAll初始化一個集合:
List<User>desList2 = new ArrayList<>();
Collections.addAll(desList2,new User[srcList.size()]);
Collections.copy(desList2,srcList);
System.out.println("desc2");
System.out.println(desList2.toString());
2)Arrays.asList設定集合的大小:
List<User>desList1 = new ArrayList<>(Arrays.asList(new User[srcList.size()]));
Collections.copy(desList1,srcList);
System.out.println("desc1:");
System.out.println(desList1.toString());
註:上面兩種方法都是淺拷貝(拷貝後兩個list的元素(引用)不同,但是引用所指向的對象是一樣的。即是兩個list的每個元素指向的還是通一記憶體。)如果想深拷貝,需要對集合中的元素進行clone操作。