如何在Java中从数组(int )创建ArrayList(ArrayList )

我看到了一个问题: 从数组中创建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 list = new ArrayList(Arrays.asList(elements)); System.out.println(list); // this works List intList = null; intList = Arrays.asList(3, 5); System.out.println(intList); int[] intArray = new int[] { 0, 1 }; // this doesn't work! intList = new ArrayList(Arrays.asList(intArray)); System.out.println(intList); } } 

我在这做错了什么? 代码不应该是intList = new ArrayList(Arrays.asList(intArray)); 编译得好吗?

问题在于

 intList = new ArrayList(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(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(Arrays.asList(integerArray)); 

但由于你已经在使用for循环,我不介意使用临时包装类数组,只需将你的项目直接添加到列表中:

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

使用Java 8,您可以在一行中完成:

        
 int [] intArr = {1,1,2,3,5,8,11};  
 List  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(Arrays.asList(intArray)); 

问题是关于Autoboxing。 Java会自动将int自动转换为Integer ,但不会将int[]转换为Integer[] 。 因此原因。

 public static  List asList(T... a) 

asList定义如上。 它期望T型的vararg。 即它可以采用T类型的对象数组。 在您的情况下,因为Java无法将int[]转换为Integer[] ,因此它将类型T视为int[]而不是Integer 。 因此,您将获得List类型的List 。 你必须从int[]手动将其转换为`Integer[] int[]

Joshua Bloch的“ Effective Java ”一书中有一个很好的项目,他用varargs解释了坑,这就是其中之一。

集合想要对象和基元不是从Object派生的。 所以Integer允许但int不允许。

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

举个例子:

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