协慌网

登录 贡献 社区

从数组创建 ArrayList

我有一个初始化的数组,如:

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

我想将此数组转换为 ArrayList 类的对象。

ArrayList<Element> arraylist = ???;

答案

new ArrayList<>(Arrays.asList(array))

鉴于:

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()返回的列表由原始数组支持。如果修改原始数组,则也会修改列表。这可能会令人惊讶。

(老线程,但只有 2 美分,因为没有提到番石榴或其他图书馆和其他一些细节)

如果可以,请使用番石榴

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

用法

对于不可变列表

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

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

为何选择番石榴?

主要的吸引力可能是减少因类型安全的仿制药造成的混乱,因为使用番石榴工厂方法可以在大多数时间推断出类型。然而,自 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但实际上直接引用传递的数组并使其 “直写”(修改反映在数组中)。

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

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

对于可变列表

与上面相同,但用实际的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);
}