2014-01-14 87 views
0

我有一個雙數組doubleArray1。我嘗試了Arrays.asList().contains()操作如下圖所示Arrays.asList()。contains()在雙雙陣列中

double doubleArray1 [] = {1D,2D,3D}; 
if(Arrays.asList(doubleArray1).contains(1D)) { 
    System.out.println("hello-1"); 
} 

它不顯示任何信息。然後我做了一個Double array

Double doubleArray1 [] = {1D,2D,3D};   
if(Arrays.asList(doubleArray1).contains(1D)) { 
    System.out.println("hello-1"); 
} 

它打印hello-1

有人可以解釋爲什麼這種差異?

回答

8

您對Arrays.asList第一調用實際上返回List<double[]> - 它的自動裝箱的說法,因爲一個double[]不是T[] ...仿製藥不允許原始類型的類型參數。

如果要將double[]轉換爲List<Double>,則需要手動執行此操作或使用第三方庫執行此操作。例如:

public List<Double> toList(double[] doubles) { 
    List<Double> list = new ArrayList<>(doubles.length); 
    for (double x : doubles) { 
     list.add(x); 
    } 
    return list; 
} 

注意,不像Arrays.asList隨後到陣列的任何更改將不反映在列表或反之亦然 - 這是一個副本,而不是一個視圖。

0

通用允許使用類型不是原始類型。因此,在將其與原始數據進行比較時,它並不會給出您輸出的意願,但類類型會爲您提供結果。

0

要添加到Jon的回答:asList需要一個可變參數列表,並且可變參數參數不像自動方式那樣自動執行。不涉及仿製藥一個簡單的例子:

public void foo(Double... x) { whatever } 

double[] doubleArray1 = {1D,2D,3D}; 

foo(doubleArray1); // error 

提供了錯誤argument type double[] does not conform to vararg element type Double。這同樣適用於asList;這裏發生的事情是因爲Arrays.asList是通用的,並且你沒有明確地給出它的泛型類型,它會選擇任何作品; Double不起作用(出於同樣的原因foo調用不會編譯),和double[]確實工作。這個表達式,如果你明確地給它通用的參數,在編譯時會給你同樣的錯誤:

Arrays.<Double>asList(doubleArray1).contains(1D)