2013-07-08 74 views
17
(INT [])

我已經看到了問題:Create ArrayList from array如何從陣列創建的ArrayList(ArrayList的<Integer>)在Java中

然而,當我嘗試用以下代碼解決方案,它不是在做所有的工作相當案例:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collection; 
import java.util.List; 

public class ToArrayList { 

    public static void main(String[] args) { 
     // this works 
     String[] elements = new String[] { "Ryan", "Julie", "Bob" }; 
     List<String> list = new ArrayList<String>(Arrays.asList(elements)); 
     System.out.println(list); 

     // this works 
     List<Integer> intList = null; 
     intList = Arrays.asList(3, 5); 
     System.out.println(intList); 

     int[] intArray = new int[] { 0, 1 }; 
     // this doesn't work! 
     intList = new ArrayList<Integer>(Arrays.asList(intArray)); 
     System.out.println(intList); 
    } 
} 

我在做什麼錯在這裏?代碼intList = new ArrayList<Integer>(Arrays.asList(intArray));不應該編譯好嗎?

+0

感謝所有的答案。我發現了這個編譯錯誤的幾個原因:1. Java不會autobox原始數組。 2.可變參數很難正確使用 - http://stackoverflow.com/questions/2925153/can-i-pass-an-array-as-arguments-to-a-method-with-variable-arguments-in-java/2926653#2926653 – tuxdna

+0

+1這是一個很好的問題。我建議任何人閱讀它來閱讀所有的答案,他們都會添加重要的信息。 – DaveM

回答

21

問題在

intList = new ArrayList<Integer>(Arrays.asList(intArray)); 

是,由於基本數組從Object延伸int[]被認爲是一個單一的Object實例。如果您有Integer[]而不是int[],這將起作用,因爲您現在正在發送一個Object的數組。

Integer[] intArray = new Integer[] { 0, 1 }; 
//now you're sending a Object array 
intList = new ArrayList<Integer>(Arrays.asList(intArray)); 

從您的評論:如果你想仍然使用int[](或其他基本類型數組)作爲主要的數據,那麼你需要創建一個包裝類的附加陣列。在這個例子中:

int[] intArray = new int[] { 0, 1 }; 
Integer[] integerArray = new Integer[intArray.length]; 
int i = 0; 
for(int intValue : intArray) { 
    integerArray[i++] = intValue; 
} 
intList = new ArrayList<Integer>(Arrays.asList(integerArray)); 

但既然你已經在使用一個for循環,我不會介意使用一個臨時包裝類陣列,只需直接添加項目到列表:

int[] intArray = new int[] { 0, 1 }; 
intList = new ArrayList<Integer>(); 
for(int intValue : intArray) { 
    intList.add(intValue); 
} 
+0

感謝您的回答。我如何將原始數組轉換爲盒裝數組而不是創建新數組(例如,不使用循環)?我只期待我可以使用的一小段代碼。 – tuxdna

7

它不起作用,因爲您正在使用int[]而不是Integer[]。試試這個:

Integer[] intArray = new Integer[] { 0, 1 }; 
// this should work now 
intList = new ArrayList<Integer>(Arrays.asList(intArray)); 
3

收集想要的對象和原語不是從Object派生的。所以Integer允許但不允許int

所以你必須使用包裝類Integer而不是int這是原始類型。

剛例如:

Integer[] intArray = new Integer[] { 0, 1 }; 
intList = new ArrayList<Integer>(Arrays.asList(intArray)); 
6

的問題是關於自動裝箱。 Java自動將int自動轉換爲Integer,但它不會將int[]轉換爲Integer[]。因此,原因。

public static <T> List<T> asList(T... a) 

asList如上定義。它期望類型爲T的可變參數。即它可以採用一組T類型的對象。在你的情況下,因爲Java不能將int[]轉換爲Integer[],因此根據需要它需要T作爲int[]而不是Integer。因此你得到一個List<int[]類型的列表。你將不得不手動將其轉換成`Integer[]int[]

有由Joshua布洛赫在書中Effective Java一個很好的項目,他解釋了可變參數的坑,這是其中之一。

8

與Java 8,你可以做一個行:

   
int[] intArr = { 1, 1, 2, 3, 5, 8, 11}; 
List<Integer> list = Arrays.stream(intArr).boxed().collect(Collectors.toList()); 
list.forEach(System.out::println); 
相關問題