Java 中如何将 Array 转为 ArrayList?
原文地址:http://www.programcreek.com/2013/04/how-to-convert-array-to-arraylist-in-java/
这篇文章分析了 Stack Overflow 中最受赞誉的答案。 问这个问题的人获得了很高的声望,这可以让他在 Stack Overflow 上做很多事情。 但这对我来说没什么意义,还是让我们先来看看这个问题吧。
这个问题是“如何将以下 Array 转换为 ArrayList?”
Element[] array = {new Element(1),new Element(2),new Element(3)};
1. 得票最高的答案
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));
首先,我们来看看 Java Doc 对 ArrayList 构造方法的解释:
ArrayList(Collection < ? extends E > c) : Constructs a list containing the elements of the specified collection, in the order they are returned by the collection's iterator.
构造函数的作用如下:
- 将集合 c 转换为数组
- 将数组复制到后面名为 "elementData"的数组
以下是 ArrayList 构造函数的源代码:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
2. 另一个热门答案
List<Element> list = Arrays.asList(array);
其实这并不是最好的方式,因为 asList() 返回的集合大小是固定的。 实际上,返回的不是 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);
4. 问题的意义
这个问题其实不难,但很有趣。 每个 Java 程序员都知道 ArrayList,但很容易犯这样的错误。 我想这就是为什么这个问题如此受欢迎。 我想,要是换做一个特定领域中的问题,估计就不会这么受欢迎了。