先確定幾個概念,這里說的數組元素,除基本類型數組外,並非指元素對象本身,而是它們的引用。換句話說,基本數組的元素是數值本身,非基本數組的元素都是一個地址(對應指針)。
1.collection的元素不能是基本類型
首先,各種collectioin容器的元素都只能是繼承了Object類的對象,所以不能是8種基本類型。如果要放入基本類型,必需要用它們對應的包裝器進行包裝。
關於基本類型與包裝類的區別:基本類型是儲存在堆棧中的,這一點和C++的非new基本類型一樣(c++所有非new對象都是在堆棧中的),也和C#的值類型一樣;包裝類是儲存在棧中的,和c++中new出來的對象以及C#中的引用類型一樣;
在調用Arrays的靜態方法asList(<T>[])時,T是根據collection聲明時的泛型參數確定的,所以不僅collection的泛型參數不能是基本類型,傳入的數組也不能是基本類型,如下面這樣,編譯時就會報錯:
1 import java.util.*; 2 public class TestArray2List{ 3 4 public static void main(String[] args){ 5 inte[] valueTypeArray={2,3,4,5,6}; 6 List<Integer> valueTypeList=new ArrayList<Integer>(); 7 valueTypeList.addAll(Arrays.asList(valueTypeArray)); 8 System.out.println("valueTypeList:\n"); 9 for(int value:valueTypeList){ 10 System.out.println(value); 11 12 } 13 14 } 15 16 }
錯誤信息:
.\TestArray2List.java:7: 錯誤: 對於addAll(List<int[]>), 找不到合適的方法 valueTypeList.addAll(Arrays.asList(valueTypeArray)); ^ 方法 Collection.addAll(Collection<? extends Integer>)不適用 (參數不匹配; 推斷類型不符合上限 推斷: int[] 上限: Integer,Object) 方法 List.addAll(Collection<? extends Integer>)不適用 (參數不匹配; 推斷類型不符合上限 推斷: int[] 上限: Integer,Object)
2.Arrays.asList()是對數組元素(復制指針)的復制
再次強調,非基本類型數組元素只是一個指針。因為collection的類型只能是非基本類型,所以collectioin存的都是指針。當用Arrays.asList(),把一個Array轉為一個List<T>時,是把所有的指針復制一遍,比如下面的,更改原數組的值(指針指向一個新對向)時,List<T>的值不變,所以再次都是輸出1:
import java.util.*; public class TestArray2List{ public static void main(String[] args){ Integer[] valueTypeArray={1,2,3,4,5,6}; List<Integer> valueTypeList=new ArrayList<Integer>(); valueTypeList.addAll(Arrays.asList(valueTypeArray)); System.out.println("valueTypeList[0]:"); System.out.println(valueTypeList.get(0)); valueTypeArray[0]=new Integer(99); System.out.println(valueTypeList.get(0)); } }
輸出:
1 1
3.Arrays.asList()具體的對象值不會復制
上面已經提到了,asList()是對指針的復制,List<T>和Array是兩個指針序列,對應的元素指向相同的對象,比如下面這樣,Array的每個元素是一個指向int數組的二級指針,List<T>的每個元素也是二級指針,它們對應的元素指向同一個int[](一個int數據序列)。因為指向同一個對象,所以對象的內容發生變化時,List<T>和原Array都會變化。
import java.util.*; public class TestArray2List{ public static void main(String[] args){ int[][] valueTypeArray={{1,2},{3,4},{5,6}}; List<int[]> valueTypeList=new ArrayList<int[]>(); valueTypeList.addAll(Arrays.asList(valueTypeArray)); System.out.println("valueTypeList[0]:"); System.out.println(valueTypeList.get(0)[0]); valueTypeArray[0][0]=99; System.out.println(valueTypeList.get(0)[0]); } }
輸出:
1 99