簡體   English   中英

如何在Java中從數組(int [])創建ArrayList(ArrayList <Integer>)

[英]How to create ArrayList (ArrayList<Integer>) from array (int[]) in Java

我看到了一個問題: 從數組中創建ArrayList

但是,當我使用以下代碼嘗試該解決方案時,它並不適用於所有情況:

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)); 編譯得好嗎?

問題在於

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);
}

使用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);

它不起作用,因為你使用int[]而不是Integer[] 試試這個:

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

問題是關於Autoboxing。 Java會自動將int自動轉換為Integer ,但不會將int[]轉換為Integer[] 因此原因。

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

asList定義如上。 它期望T型的vararg。 即它可以采用T類型的對象數組。 在您的情況下,因為Java無法將int[]轉換為Integer[] ,因此它將類型T視為int[]而不是Integer 因此,您將獲得List<int[]類型的List<int[] 你必須從int[]手動將其轉換為`Integer[] int[]

Joshua Bloch在“ Effective Java ”一書中有一個很好的項目,他用varargs解釋了坑,這就是其中之一。

集合想要對象和基元不是從Object派生的。 所以Integer允許但int不允許。

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

舉個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM