将int[]
数组元素复制到ArrayList
中的最佳方法是什么?
我需要快速完成,那么最快的方法是什么?
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]));
使用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));
new ArrayList<Integer>();
改为 new ArrayList<Integer>(intArray.length);
以避免重新分配数组。 - Pau Kiat WeeArrays.asList(intArray)
返回的是List<int[]>
。所以似乎我们实际上必须在这里使用循环,或者我们是否可以将一个int[]
转换成一个Integer[]
数组? - Niklas B.int[]
数组 :) 当然,如果第一个示例不适用于他/她,OP可以跳过它。 - Niklas B.List<Integer> li = Arrays.asList(intArray);
,我得到了类型不匹配:无法将List<int[]>转换为List<Integer>
。 - likejudo使用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);
}
我也提供一个备选答案,这取决于列表的使用方式,这种方法可能会更加高效(创建速度更快,只转换实际使用的整数,但它们总是被转换而不仅仅是第一次,所以重复获取相同元素的时间更长)。在数组周围创建一个简单的包装器列表:
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>() { ...
};
}
Arrays.asList
不够用吗? - Niklas B.