首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中从数组(int[])创建ArrayList (ArrayList<Integer>)

如何在Java中从数组(int[])创建ArrayList (ArrayList<Integer>)
EN

Stack Overflow用户
提问于 2013-07-08 15:15:53
回答 3查看 101K关注 0票数 28

我看过这个问题:Create ArrayList from array

但是,当我使用以下代码尝试该解决方案时,并不是在所有情况下都能正常工作:

代码语言:javascript
复制
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));不应该编译得很好吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-08 15:16:54

中的问题

代码语言:javascript
复制
intList = new ArrayList<Integer>(Arrays.asList(intArray));

int[]视为单个Object实例,因为基本数组是从Object扩展而来的。如果您使用Integer[]而不是int[],这将会起作用,因为您现在正在发送一个Object数组。

代码语言:javascript
复制
Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));

如果您仍然希望使用int[] (或另一个原始类型数组)作为主数据,则需要使用包装器类创建一个额外的数组。在此示例中:

代码语言:javascript
复制
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循环,所以我不介意使用临时包装器类数组,只需将您的项直接添加到列表中:

代码语言:javascript
复制
int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
    intList.add(intValue);
}
票数 35
EN

Stack Overflow用户

发布于 2013-07-08 16:25:36

问题与自动装箱有关。Java会自动将int转换为Integer,但不会将int[]转换为Integer[]。这就是原因所在。

代码语言:javascript
复制
public static <T> List<T> asList(T... a)

asList的定义如下所示。它需要一个T类型的变量。也就是说,它可以接受T类型的对象数组。在您的例子中,由于Java不能将int[]转换为Integer[],因此它将T类型作为int[]而不是Integer。因此,您会得到一个类型为List<int[]的列表。您必须手动将其从int[]转换为`Integer[]

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

票数 8
EN

Stack Overflow用户

发布于 2013-07-08 15:17:50

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

代码语言:javascript
复制
Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17520964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档