Java中Arrays的asList()方法

Away_D發表於2017-08-03

Java中Arrays的asList()方法 可以將 陣列轉為List 但是,這個陣列型別必須是 引用型別的,如果是8中基本資料型別就不可以 原因如下,引用別人的一篇文章:



最近在用Arrays的asList()生成的List時,List元素的個數時而不正確。


Java程式碼

//經多次測試,只要傳遞的基本型別的陣列,生成List的元素個數均為1  
char arrc = {'a','b'};  
int  arrint = {1,2,4};  
Arrays.asList(arrc).size() ;//  結果為1;  
Arrays.asList(arrint ).size() ;//結果為1;  
   
//傳遞物件陣列,元素個數正確。  
String arrstr = {"a","b","java","spring","hadoop","lucene"};  
Arrays.asList(arrstr ).size() ;//結果為6;  
跟原始碼:


Java程式碼  


  public static <T> List<T> asList(T... a) {  
 return new ArrayList<T>(a);  
}  
繼續跟,Arrays的私有內部類ArrayList  (沒搞明白,為什麼這裡也起名為ArrayList)


private final E[] a;  
  
ArrayList(E[] array) {  
           if (array==null)  
               throw new NullPointerException();  
    a = array;  
}  
  
public int size() {  
    return a.length;  
}  
發現問題出在java5 的可變引數上。於是寫了demo,測試。


public class TestArray {  
    PrintStream out = System.out;  
    @Test  
    public void array() {  
        char[] arrc = {'a','b','c','d','e'};  
        out.println("傳遞char陣列:");  
        print(arrc);  
        out.println("直接傳遞:");  
        print('a','b','c','d','e');  
        out.println("----------------------------");  
          
        int[] arri = {1,2,3,4,5,6,7};  
        out.println("傳遞int陣列:");  
        print(arri);  
        out.println("直接傳遞:");  
        print(1,2,3,4,5,6,7);  
        out.println("----------------------------");  
          
        Integer[] arrInt = {1,2,3,4,5,6,7};  
        out.println("傳遞Integer陣列:");  
        print(arrInt);  
        out.println("直接傳遞:");  
        print(1,2,3,4,5,6,7);  
        out.println("----------------------------");  
          
        String[] arrs = {"a","b","c","d","e"};  
        out.println("傳遞String陣列:");  
        print(arrs);  
        out.println("直接傳遞:");  
        print('a','b','c','d','e');  
        out.println("----------------------------");  
    }  
      
    public void print(Object...arr){  
        out.print("內容:"+Arrays.toString(arr));  
        out.println("\t\t陣列長度:"+arr.length+" ");  
    }  
}  
輸出結果為:


傳遞char陣列:  
內容:[[C@defa1a]      陣列長度:1   
直接傳遞:  
內容:[a, b, c, d, e]      陣列長度:5   
----------------------------  
傳遞int陣列:  
內容:[[I@f5da06]      陣列長度:1   
直接傳遞:  
內容:[1, 2, 3, 4, 5, 6, 7]        陣列長度:7   
----------------------------  
傳遞Integer陣列:  
內容:[1, 2, 3, 4, 5, 6, 7]        陣列長度:7   
直接傳遞:  
內容:[1, 2, 3, 4, 5, 6, 7]        陣列長度:7   
----------------------------  
傳遞String陣列:  
內容:[a, b, c, d, e]      陣列長度:5   
直接傳遞:  
內容:[a, b, c, d, e]      陣列長度:5   
----------------------------  
java 5 可變引數,直接傳遞值與傳遞陣列處理的機制不太相同。


如果直接傳遞陣列,基本型別陣列將被視為一個物件而不會被解析成陣列,如果直接傳遞引數將能正常解析。因此傳遞基本型別陣列時強烈建議轉為其封裝類物件的陣列  int ->Integer ,long->Long …………。(未對其封裝)




這樣寫就很清楚了吧
public static void main(String[] args) {
  int[] intArray = {1,2,3};
  List<int[]> myList = Arrays.asList(intArray);
  System.out.println(myList.size());
  System.out.println(myList.get(0).length);


}


大概明白了:定義:


public static <T> List<T> asList(T... a) { 
return new ArrayList<T>(a); 
}


這個T必須是物件型別。好比我們不能new ArrayList<int> 只能new ArrayList<Integer>


原文地址:http://www.java3z.com/cwbwebhome/article/article8/83483.html?id=4483

相關文章