【发布时间】:2012-05-03 09:37:18
【问题描述】:
将int[] 数组元素重新复制到ArrayList 的最佳方法是什么?
我需要快速完成此操作,那么最快的方法是什么?
【问题讨论】:
-
嗯,
Arrays.asList还不够吗? -
“我需要快速执行此操作” 快速输入代码还是快速执行?后者应该在运行时进行测试,但考虑到似乎对这个问题进行了大量的思考/研究,我怀疑你的意思是前者。
将int[] 数组元素重新复制到ArrayList 的最佳方法是什么?
我需要快速完成此操作,那么最快的方法是什么?
【问题讨论】:
Arrays.asList 还不够吗?
我也会提供一个替代答案,这取决于 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>() { ...
};
}
【讨论】:
有了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);
}
【讨论】:
使用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); 以避免重新分配数组
Arrays.asList(intArray) 返回List<int[]>。所以看起来我们实际上必须在这里使用循环,或者我们可以以某种方式将int[] 转换为Integer[] 数组?
Integer[] 而不是 int[] 可以解决问题。
int[] 数组,具体来说:) 当然,如果它对他/她不起作用,OP 可以跳过第一个样本。
List<Integer> li = Arrays.asList(intArray); 我得到Type mismatch: cannot convert from List<int[]> to List<Integer>
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]));
【讨论】: