我知道您可以在实例化期间初始化数组,如下所示:
String[] names = new String[] {"Ryan", "Julie", "Bob"};
有没有办法用ArrayList做同样的事情?或者我必须使用array.add()
单独添加内容吗?
答案 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()。
如果你有很多元素,它有点冗长,但你可以:
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));
但是,在创建最终数组之前,了解所选答案的内部重要内容需要多次复制元素,并且有一种方法可以减少部分冗余。
让我们先了解一下发生了什么:
首先,元素被复制到静态工厂Arrays.ArrayList<T>
创建的Arrays.asList(T...)
中。
尽管具有相同的简单类名,但这并不产生与java.lang.ArrayList
相同的类。尽管有List接口,它仍然不实现像remove(int)
这样的方法。如果你调用这些方法,它将抛出UnspportedMethodException
。但如果您只需要一个固定大小的列表,那么您可以在这里停下来。
接下来,#1中构造的Arrays.ArrayList<T>
将传递给构造函数ArrayList<>(Collection<T>)
,其中调用collection.toArray()
方法来克隆它。
public ArrayList(Collection<? extends E> collection) {
......
Object[] a = collection.toArray();
}
接下来,构造函数决定是采用克隆数组,还是再次复制以删除子类类型。由于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;
因此,我们的数据被复制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();
这是一个非常酷的库,为您节省了大量时间。