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()。
如果你有很多元素,这有点冗长,但你可以:
- 使用Groovy或类似的东西
- 使用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某些冗余。
让我们开始了解正在发生的事情:
-
首先,将元素复制到由静态工厂
Arrays.asList(T...)
创build的Arrays.ArrayList<T>
。这不会产生与
java.lang.ArrayList
相同的类,尽pipe具有相同的简单类名。 尽pipe有一个List接口,但它并不实现像remove(int)
这样的方法。 如果你调用这些方法,它会抛出一个UnspportedMethodException
。 但是,如果你只需要一个固定大小的列表,你可以在这里停下来。 -
接下来,将#1中构造的
Arrays.ArrayList<T>
传递给构造函数ArrayList<>(Collection<T>)
,其中调用collection.toArray()
方法来克隆它。public ArrayList(Collection<? extends E> collection) { ...... Object[] a = collection.toArray(); }
-
接下来,构造函数决定是否采用克隆的数组,或者再次复制它以除去子类的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();
这是一个非常酷的图书馆,为您节省了大量的时间。