ArrayList初始化等效于数组初始化

时间:2010-05-03 20:27:59

标签: java arrays initialization arraylist

我知道您可以在实例化期间初始化数组,如下所示:

String[] names = new String[] {"Ryan", "Julie", "Bob"};

有没有办法用ArrayList做同样的事情?或者我必须使用array.add()单独添加内容吗?

8 个答案:

答案 0 :(得分:322)

Arrays.asList可以在这里提供帮助:

new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

答案 1 :(得分:60)

new ArrayList<String>(){{
   add("A");
   add("B");
}}

这实际上做的是创建一个派生自ArrayList<String>的类(外部括号组执行此操作),然后声明一个静态初始化器(内部大括号集)。这实际上是包含类的内部类,因此它将具有隐式this指针。没有问题,除非你想要序列化它,或者你期望外部类被垃圾收集。

我知道Java 7将提供additional language constructs来完全按照你想要的那样做。

编辑:最近的Java版本为创建此类集合提供了更多可用的功能,并且值得研究以上内容(在这些版本之前提供)

答案 2 :(得分:33)

这是您最接近的地方:

ArrayList<String> list = new ArrayList(Arrays.asList("Ryan", "Julie", "Bob"));

您可以更简单地使用:

List<String> list = Arrays.asList("Ryan", "Julie", "Bob")

查看Arrays.asList的源代码,它构造一个ArrayList,但默认情况下会转换为List。所以你可以这样做(但不能可靠地用于新的JDK):

ArrayList<String> list = (ArrayList<String>)Arrays.asList("Ryan", "Julie", "Bob")

答案 3 :(得分:24)

Arrays.asList("Ryan", "Julie", "Bob");

答案 4 :(得分:8)

嗯,在Java中没有列表的字面语法,所以你必须这样做.add()。

如果你有很多元素,它有点冗长,但你可以:

  1. 使用Groovy或类似的东西
  2. 使用Arrays.asList(array)
  3. 2看起来像是:

    String[] elements = new String[] {"Ryan", "Julie", "Bob"};
    List list = new ArrayList(Arrays.asList(elements));
    

    这会导致一些不必要的对象创建。

答案 5 :(得分:5)

所选答案为:ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

但是,在创建最终数组之前,了解所选答案的内部重要内容需要多次复制元素,并且有一种方法可以减少部分冗余。

让我们先了解一下发生了什么:

  1. 首先,元素被复制到静态工厂Arrays.ArrayList<T>创建的Arrays.asList(T...)中。

    尽管具有相同的简单类名,但这并不产生与java.lang.ArrayList相同的类。尽管有List接口,它仍然不实现像remove(int)这样的方法。如果你调用这些方法,它将抛出UnspportedMethodException。但如果您只需要一个固定大小的列表,那么您可以在这里停下来。

  2. 接下来,#1中构造的Arrays.ArrayList<T>将传递给构造函数ArrayList<>(Collection<T>),其中调用collection.toArray()方法来克隆它。

    public ArrayList(Collection<? extends E> collection) {
    ......
    Object[] a = collection.toArray();
    }
    
  3. 接下来,构造函数决定是采用克隆数组,还是再次复制以删除子类类型。由于Arrays.asList(T...)内部使用类型为T的数组,我们作为参数传递的数组非常相同,因此构造函数总是拒绝使用克隆,除非T是纯对象。 (例如,String,Integer等都会再次复制,因为它们会扩展Object)。

    if (a.getClass() != Object[].class) {      
        //Arrays.asList(T...) is always true here 
        //when T subclasses object
        Object[] newArray = new Object[a.length];
        System.arraycopy(a, 0, newArray, 0, a.length);
        a = newArray;
    }
    array = a;
    size = a.length;
    
  4. 因此,我们的数据被复制3次只是为了显式初始化ArrayList。如果我们强制Arrays.AsList(T...)构造一个Object []数组,我们可以将它降低到2x,这样ArrayList可以在以后采用它,可以按如下方式完成:

    (List<Integer>)(List<?>) new ArrayList<>(Arrays.asList((Object) 1, 2 ,3, 4, 5));
    

    或者只是在创建后添加元素可能仍然是最有效的。

答案 6 :(得分:3)

这个怎么样。

ArrayList<String> names = new ArrayList<String>();
Collections.addAll(names, "Ryan", "Julie", "Bob");

答案 7 :(得分:2)

这是使用op4j Java库的流畅界面(1.1。于2010年12月发布)完成的方法: -

List<String> names = Op.onListFor("Ryan", "Julie", "Bob").get();

这是一个非常酷的库,为您节省了大量时间。