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.

构造函数的作用如下:

  1. 将集合 c 转换为数组
  2. 将数组复制到后面名为 "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,但很容易犯这样的错误。 我想这就是为什么这个问题如此受欢迎。 我想,要是换做一个特定领域中的问题,估计就不会这么受欢迎了。

results matching ""

    No results matching ""