繁体   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