ArrayList的初始化等同于数组的初始化

我知道你可以在实例化过程中初始化一个数组,如下所示:

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

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

Arrays.asList可以在这里帮助:

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

是。

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

这实际上是在创build一个从ArrayList<String>派生的类(外层的大括号做这个),然后声明一个静态的初始化(大括号的内部集合)。 这实际上是包含类的内部类,所以它将有一个隐含的指针。 除非你想要连载它,否则不是问题,或者你期望外部类被垃圾收集。

我明白,Java 7将提供额外的语言结构来做你想要的。

编辑:最近的Java版本提供了更多可用的function来创build这样的集合,并且值得研究以上(在这些版本之前提供)

这里是最接近你可以得到:

 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") 
 Arrays.asList("Ryan", "Julie", "Bob"); 

那么,在Java中没有列表的文字语法,所以你必须做.add()。

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

  1. 使用Groovy或类似的东西
  2. 使用Arrays.asList(数组)

2看起来像这样:

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

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

这个怎么样。

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

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

然而,理解所选答案的重要之处在于在创build最终数组之前内部复制元素几次,并且有办法减less某些冗余。

让我们开始了解正在发生的事情:

  1. 首先,将元素复制到由静态工厂Arrays.asList(T...)创build的Arrays.ArrayList<T>

    这不会产生与java.lang.ArrayList相同的类,尽pipe具有相同的简单类名。 尽pipe有一个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. 接下来,构造函数决定是否采用克​​隆的数组,或者再次复制它以除去子类的types。 由于Arrays.asList(T...)内部使用Ttypes的数组,我们作为parameter passing的数组是相同的,构造函数总是拒绝使用克隆,除非T是纯粹的对象。 (例如,string,整数等全部得到复制,因为它们扩展对象)。

     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; 

因此,我们的数据被复制3x只是显式初始化ArrayList。 如果我们强制Arrays.AsList(T...)来构造一个Object []数组,那么我们可以把它降低到2x,以便ArrayList稍后可以采用它,这可以按如下方式完成:

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

或者,也许只是在创build后添加元素仍然是最有效的。

这是如何使用op4j Java库的stream畅接口完成的(1.1。于10年10月发布): –

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

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