从数组创建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);

这将工作正常。 但有些警告:

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

  • (旧线程,但只有2美分,因为没有提到番石榴或其他库和一些其他细节)

    如果你可以,使用番石榴

    值得指出番石榴的方式,这大大简化了这些恶作剧:

    用法

    对于不可变列表

    使用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工厂方法可以在大多数情况下推断类型。 然而,自从Java 7与新的钻石运营商一起抵达后,这个论点的用水量就减少了。

    但它不是唯一的原因(Java 7并不是每个地方都有):简写语法也非常方便,如上所述,方法初始化器允许编写更多富有表现力的代码。 你可以在一个Guava中调用当前Java Collections的2。


    如果你不能...

    对于不可变列表

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

    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);
    }
    
    链接地址: http://www.djcxy.com/p/365.html

    上一篇: Create ArrayList from array

    下一篇: How can I get query string values in JavaScript?