13

int[]将数组元素重新复制到的最佳方法是什么ArrayList

我需要快速做到这一点,那么最快的方法是什么?

4

4 回答 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 等原语时在 var-args 中也被视为对象。对象数组虽然有效:

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]));
于 2012-04-22T15:54:11.520 回答
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));
于 2012-04-22T15:37:54.087 回答
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);
}
于 2012-04-22T16:17:31.063 回答
2

我还将提供一个替代答案,这取决于 List 的使用方式,这可以更好地执行(创建速度更快,并且只有实际使用的 int 被转换,但它们总是被转换,而不仅仅是第一次,所以重复获取相同的元素更糟)。在数组周围创建一个简单的包装器列表:

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>() { ...
             };
}
于 2012-04-22T16:46:32.200 回答