给定Element[]类型的数组:

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

如何将此数组转换为ArrayList<Element>类型的对象?

ArrayList<Element> arrayList = ???;

当前回答

在Java 9中,您可以使用:

List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);

其他回答

(旧线索,但只有2美分,因为没有提到番石榴或其他libs以及其他一些细节)

如果可以,请使用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工厂方法可以在大多数时间推断类型。然而,自从Java7引入了新的diamond操作符以来,这一论点就不那么有效了。

但这并不是唯一的原因(Java7还没有普及):速记语法也非常方便,如上所述,方法初始化器允许编写更具表达力的代码。在当前的Java集合中,您只需一次Guava调用即可完成2。


如果你不能。。。

对于不可变列表

使用JDK的Arrays类及其asList()工厂方法,用Collections.unmodifiebleList()包装:

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.unmodifiebleList()包装。

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

对于可变列表

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

还有一种方法可以用于将数组转换为ArrayList。您可以遍历数组并将每个索引插入ArrayList中,然后将其返回到ArrayList。

如下所示。

public static void main(String[] args) {
        String[] array = {new String("David"), new String("John"), new String("Mike")};

        ArrayList<String> theArrayList = convertToArrayList(array);
    }

    private static ArrayList<String> convertToArrayList(String[] array) {
        ArrayList<String> convertedArray = new ArrayList<String>();

        for (String element : array) {
            convertedArray.add(element);
        }

        return convertedArray;
    }

您可以使用Cactos创建ArrayList(我是开发人员之一):

List<String> names = new StickyList<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

不能保证该对象实际上是ArrayList类。如果您需要该担保,请执行以下操作:

ArrayList<String> list = new ArrayList<>(
  new StickyList<>(
    "Scott Fitzgerald", "Fyodor Dostoyevsky"
  )
);

根据这个问题,使用java 1.7的答案是:

ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));

但是,最好始终使用界面:

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

对于正常大小的数组,上面的答案是正确的。如果您有巨大的数组大小并使用java8,您可以使用流来实现。

  Element[] array = {new Element(1), new Element(2), new Element(3)};
  List<Element> list = Arrays.stream(array).collect(Collectors.toList());