这篇文章主要讨论Stack Overflow上面公选投票最多的一个问题:
如何把下面的数组转换成为一个ArrayList?
Element[] array = {new Element(1),new Element(2),new Element(3)};
1. 点赞最多的答案
最受认可的答案如下:
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));
首先,让我们看一下Java帮助文档中ArrayList的这种带参构造方法的说明
ArrayList(Collection < ? extends E > c) : 构造一个list,用迭代器将指定collection中的元素按顺序放入其中。
这个构造方法的实现过程:
- 将collection c的元素转换成一个数组
- 将这个数组复制给ArrayList的成员变量数组“elementData”
源代码:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
2. 点赞第二的答案
排名第二的答案如下:
List<Element> list = Arrays.asList(array);
这不是最佳的答案的原因在于,这个方法返回的list是固定大小的。事实上,它返回的并不是java.util.ArrayList
,而是java.util.Arrays
中一个私有静态的内部类。我们知道,ArrayList的实现原理是数组,随着元素增多,数组会"扩容";而asList()
返回的是一个固定大小的基础数据类型的数组。如果尝试添加或者删除元素,会抛出UnsupportedOperationException 异常
list.add(new Element(4));
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)
3. 其他答案
Element[] array = {new Element(1), new Element(2)};
List<element> list = new ArrayList<element>(array.length);
Collections.addAll(list, array);
问题出自:The stackoverflow question link
4. 译者补充:问题的小补充
不仅是ArrayList,其余List的子类(LinkList,Vector)也可以用同样的方法实现数组和集合转变
Integer[] array=new Integer[]{1,2,3,4,5};
LinkedList<Integer> linkedList=new LinkedList<Integer>(Arrays.asList(array));