从数组创建ArrayList

问题

我有一个数组:

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

我想将这个数组转换成 ArrayList 类的一个对象,怎样实现更好?

ArrayList<Element> arraylist = ???;

#1 热门回答(3911 赞)

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

#2 热门回答(762 赞)

鉴于:

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

最简单的答案是做:

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

这将正常工作,但是会有些警告:

  • asList() 返回的列表具有固定大小。因此,如果您想要在代码中添加或移除返回列表中的元素,则需要将其包装在新的 ArrayList 中。否则,你会得到一个UnsupportedOperationException
  • asList() 返回的列表由原始数组支持,如果修改原始数组,该 List 也会被修改,这可能会导致一些问题。

#3 热门回答(288 赞)

如果可以,请使用 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

##为什么选择 Guava

主要的原因可能是减少由类型安全引起的混淆,因为 Guava factory methods 允许在大多数情况下推断类型。然而,自从 Java 7 发布后,这个论点就没有那么多了。

但它不是唯一的原因(Java 7并不是每个地方都有):简写语法也非常方便,如上所述,方法初始化器允许编写更多富有表现力的代码。你可以在一个Guava中调用当前Java Collections的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()来覆盖元素。因此,这个列表不是真正不可变的,对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);
}