开发者问题收集

从数组创建arraylist

2008-10-01
1854600
Element[] array = {new Element(1), new Element(2), new Element(3)};

如何将上述 Element[] 类型的变量转换为 ArrayList<Element> 类型的变量?

ArrayList<Element> arrayList = ...;
3个回答

您可以使用以下指令:

new ArrayList<>(Arrays.asList(array));
Tom
2008-10-01

给定:

Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };

最简单的答案是:

List<Element> list = Arrays.asList(array);

这样就可以了。但有一些注意事项:

  1. asList 返回的列表具有 固定大小 。因此,如果您希望能够在代码中添加或删除返回列表中的元素,则需要将其包装在新的 ArrayList 中。否则,您将得到 UnsupportedOperationException
  2. asList() 返回的列表由原始数组支持。如果您修改原始数组,列表也会被修改。这可能令人惊讶。
Alex Miller
2008-10-01

(旧线程,但只有 2 分钱,因为没有提到 Guava 或其他库和一些其他细节)

如果可以,请使用 Guava

值得指出的是 Guava 方式,它大大简化了这些恶作剧:

用法

对于不可变列表

使用 ImmutableList 类及其 of() copyOf() 工厂方法 (元素不能为空)

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array

对于可变列表

使用 Lists 类及其 newArrayList() 工厂方法:

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

另请注意其他类中其他数据结构的类似方法,例如 Sets

为什么选择 Guava?

主要吸引力在于可以减少由于泛型类型安全而导致的混乱,因为使用 Guava 工厂方法 允许类型大多数情况下都是推断出来的。但是,自从 Java 7 引入了新的菱形运算符后,这种说法就站不住脚了。

但这不是唯一的原因(而且 Java 7 还没有普及):简写语法也非常方便,方法初始化器(如上所示)允许编写更具表现力的代码。您可以在一次 Guava 调用中对当前 Java 集合执行 2 的操作。


如果您不能......

对于不可变列表

使用 JDK 的 Arrays 类及其 asList() 工厂方法,用 Collections.unmodifiableList()

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

请注意, asList() 的返回类型是使用具体 ArrayList 实现的 List ,但 它不是 java.util.ArrayList 。它是一种内部类型,它模拟 ArrayList ,但实际上直接引用传递的数组并使其“直写”(修改反映在数组中)。

它禁止通过一些 List API 的方法(通过简单地扩展 AbstractList 的方式)进行修改(因此,不支持添加或删除元素),但它允许调用 set() 来覆盖元素。因此,此列表并非真正不可变,对 asList() 的调用应使用 Collections.unmodifiableList() 进行包装。

如果您需要可变列表,请参阅下一步。

对于可变列表

与上面相同,但使用实际的 java.util.ArrayList 进行包装:

List<String> l1  = new ArrayList<String>(Arrays.asList(array));    // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array));          // Java 1.7+
List<String> l2  = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b"));       // Java 1.7+

用于教育目的:好用的手动方式

// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
  final List<T> l = new ArrayList<T>(array.length);

  for (final T s : array) {
    l.add(s);
  }
  return (l);
}

// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
  final List l = new ArrayList(array.length);

  for (int i = 0; i < array.length; i++) {
    l.add(array[i]);
  }
  return (l);
}
haylem
2012-11-16