将 int[] 转换为 ArrayList

13

int[]数组元素复制到ArrayList中的最佳方法是什么?

我需要快速完成,那么最快的方法是什么?


2
哦,Arrays.asList 不够用吗? - Niklas B.
2
"我需要快速完成这个任务"。快速是指打代码的速度还是执行的速度?后者应该在运行时进行测试,但考虑到这个问题似乎需要深入思考和研究,我猜你指的是前者。 - Andrew Thompson
4个回答

19

ArrayList 不是存储 int 等原始类型的最佳方法。ArrayList 存储对象而不是原始类型。有一些库可用于带有原始类型的列表。 如果您确实想将所有原始的 int 存储为 Integer 对象,那么您需要使用 Integer.valueOf(...) 逐个进行转换(这样当不需要时就不会创建多余的 Integer 实例)。

虽然您可以这样做:

List<Integer> list = Arrays.asList(1, 2, 3);

你不能这样做:

int[] i = { 1, 2, 3 };
List<Integer> list = Arrays.asList(i); // this will get you List<int[]>

数组实际上也是一个对象,因此在使用原始数据类型(如int)的变量参数时,会被视为对象并进行处理。但对象数组可以正常工作:

List<Object> list = Arrays.asList(new Object[2]);

所以大致上是这样的:

int[] array = { 1, 2, 3 };
ArrayList<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; i++)
  list.add(Integer.valueOf(array[i]));

1
嗯,你说得对。我想知道为什么之前没有其他人提出这个问题 :) - Niklas B.
3
自从Java 1.5和自动装箱以来,您不需要再使用Integer.valueOf()。 - ZeroOne
这是正确的@ZeroOne,自动装箱为我们生成了Integer.valueOf()。 - Mattias Isegran Bergander

13

使用Arrays#asList(T... a)方法创建一个"由指定数组支持的固定大小的列表。(对返回的列表所做的更改会直接反映在数组中。)"

Integer[] intArray = {1, 2, 3, 42}; // cannot use int[] here
List<Integer> intList = Arrays.asList(intArray);

如果要将这两个数据结构解耦,可以选择以下方法:

List<Integer> intList = new ArrayList<Integer>(intArray.length);

for (int i=0; i<intArray.length; i++)
{
    intList.add(intArray[i]);
}

甚至更简洁的说:

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

1
可以将 new ArrayList<Integer>(); 改为 new ArrayList<Integer>(intArray.length); 以避免重新分配数组。 - Pau Kiat Wee
5
脉冲星有一点是正确的:这不起作用,因为Arrays.asList(intArray)返回的是List<int[]>。所以似乎我们实际上必须在这里使用循环,或者我们是否可以将一个int[]转换成一个Integer[]数组? - Niklas B.
9
是的,但问题特指 int[] 数组 :) 当然,如果第一个示例不适用于他/她,OP可以跳过它。 - Niklas B.
@MattBall你最后的方法真的有效吗?对于List<Integer> li = Arrays.asList(intArray);,我得到了类型不匹配:无法将List<int[]>转换为List<Integer> - likejudo
@likejiujitsu 你错过了一个地方。请仔细阅读。 - Matt Ball
显示剩余2条评论

6

使用Guava,您无需再关心Integer[]

int[] array;
List<Integer> list = Ints.asList(array);

如果你想要一个 ArrayList,那就是这样的

List<Integer> list = Lists.newArrayList(Ints.asList(array));

(声明:我对Guava有所贡献。)

否则,如果你只有一个int[],那么你必须按照传统的方式进行操作:

int[] array;
List<Integer> list = new ArrayList<>(array.length);
for (int val : array) {
  list.add(val);
}

2

我也提供一个备选答案,这取决于列表的使用方式,这种方法可能会更加高效(创建速度更快,只转换实际使用的整数,但它们总是被转换而不仅仅是第一次,所以重复获取相同元素的时间更长)。在数组周围创建一个简单的包装器列表:

final int[] array = {1, 2, 3};
List list = new AbstractList<Integer>() {

     public Integer get(int index) {
       return array[index];
     }

     public Integer set(int index, Integer value) {
       //or just throw new UnsupportedOperationException("..."); if not needed
       Integer old = array[index];
       array[index] = value;
       return old;
     }

     public int size() {
       return array.length;
     }
};

或者通过创建方法为您创建它:
static List<Integer> asList(final int[] array) {
  return new AbstractList<Integer>() { ...
             };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接