java collection與數組(Array)互轉


先確定幾個概念,這里說的數組元素,除基本類型數組外,並非指元素對象本身,而是它們的引用。換句話說,基本數組的元素是數值本身,非基本數組的元素都是一個地址(對應指針)。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM