java - 数组初始化arraylist - 从数组创建ArrayList




字符串数组转arraylist (20)

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

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

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

ArrayList<Element> arraylist = ???;

另一个Java8解决方案(我可能已经错过了大集中的答案。如果是这样,我的道歉)。 这会创建一个ArrayList(而不是List),即可以删除元素

package package org.something.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Junk {

    static <T> ArrayList<T>  arrToArrayList(T[] arr){
        return Arrays.asList(arr)
            .stream()
            .collect(Collectors.toCollection(ArrayList::new));
    }

    public static void main(String[] args) {
        String[] sArr = new String[]{"Hello", "cruel", "world"};
        List<String> ret = arrToArrayList(sArr);
        // Verify one can remove an item and print list to verify so
        ret.remove(1);
        ret.stream()
            .forEach(System.out::println);
    }
}

输出是......
你好
世界


Java 9

Java 9中 ,您可以使用List.of静态工厂方法来创建List文本。 类似于以下内容:

List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));

这将返回包含三个元素的immutable列表。 如果需要可变列表,请将该列表传递给ArrayList构造函数:

new ArrayList<>(List.of(// elements vararg))

JEP 269:收集的便利工厂方法

JEP 269Java Collections API提供了一些方便的工厂方法。 这些不可变的静态工厂方法内置于Java 9及更高版本的ListSetMap接口中。


(旧线程,但只有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()来覆盖元素。 因此,此列表不是真正不可变的,并且对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);
}

要将数组转换为ArrayList,开发人员通常会这样做:

List<String> list = Arrays.asList(arr);// this is wrong way..

Arrays.asList()将返回一个ArrayList,它是private static class inside Arraysprivate static class inside Arrays ,它不是java.util.ArrayList类。 The java.util.Arrays.ArrayList类具有set(), get(), contains()方法,但没有任何添加元素的方法,因此其大小是固定的。 要创建一个真正的ArrayList,您必须:

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList的构造函数可以接受Collection类型 ,它也是java.util.Arrays.ArrayList的超类型。


你可以借助Arrays.asList(arrayObj)轻松完成;

Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> arraylist =Arrays.asList(array);

另一个更新,即将结束的2014年,您也可以使用Java 8:

ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));

如果这可能只是一个List ,则会保存一些字符

List<Element> list = Stream.of(myArray).collect(Collectors.toList());

另一种简单的方法是使用for-each循环将数组中的所有元素添加到新的ArrayList中。

ArrayList<Element> list = new ArrayList<>();

for(Element e : array)
    list.add(e);

Java 9您可以使用:

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

如果数组是原始类型,则给定的答案将不起作用。 但是从Java 8开始,您可以使用:

int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());

您也可以使用Java 8中的流来完成。

 List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 

您可以在java 8中执行以下操作

ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());

您可能只需要一个List,而不是ArrayList。 在这种情况下,您可以这样做:

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

最简单的方法是添加以下代码。 尝试和测试。

String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));

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

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

但是最好总是使用界面:

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

每个人都已为您的问题提供了足够好的答案。 现在从所有建议中,您需要确定哪个符合您的要求。 您需要知道两种类型的集合。 一个是未修改的集合,另一个是允许您稍后修改对象的集合。

所以,这里我将举两个用例的简短示例。

  • 不可变集合创建::当您不想在创建后修改集合对象时

    List<Element> elementList = Arrays.asList(array)

  • 可变集合创建::当您可能想要在创建后修改创建的集合对象时。

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


由于这个问题已经很老了,令我惊讶的是没有人提出最简单的形式:

List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));

从Java 5开始, Arrays.asList()采用varargs参数,您不必显式构造数组。


鉴于:

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

使用:

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

// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray); 

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






type-conversion