将int[]
数组元素重新复制到ArrayList
的最佳方法是什么?
我需要快速做到这一点,那么最快的方法是什么?
答案 0 :(得分:18)
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]));
答案 1 :(得分:10)
使用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));
答案 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);
}
答案 3 :(得分: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>() { ...
};
}