29

我已经看到了这个问题:Create ArrayList from array

但是,当我使用以下代码尝试该解决方案时,它并不适用于所有情况:

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));编译得很好吗?

4

5 回答 5

36

问题在

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

int[]被视为单个Object实例,因为原始数组从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);
}
于 2013-07-08T07:16:53.983 回答
16

使用 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);
于 2014-11-02T09:47:13.053 回答
8

问题是关于自动装箱。Java 会自动转换intInteger自动,但不会转换int[]Integer[]. 因此原因。

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

asList定义如上。它需要一个 vararg 类型T。即它可以采用类型为对象的数组T。在您的情况下,因为 Java 无法转换int[]Integer[],因此它采用类型Tint[]不是Integer所需的类型。因此,您会得到一个 type 列表List<int[]。您必须手动将其转换为`Integer[]fromint[]

Joshua Bloch的书中有一个很好的项目Effective Java,他用可变参数解释了坑,这就是其中之一。

于 2013-07-08T08:25:36.167 回答
7

它不起作用,因为您使用的是 anint[]而不是Integer[]. 尝试这个:

Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
于 2013-07-08T07:17:50.300 回答
3

集合需要对象和原语不从对象派生。所以Integer允许但int不允许。

所以你必须使用包装类Integer而不是int原始类型。

举个例子:

 Integer[] intArray = new Integer[] { 0, 1 };
 intList = new ArrayList<Integer>(Arrays.asList(intArray));
于 2013-07-08T07:21:29.240 回答