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

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

有没有办法对数组列表做同样的事情?或者我必须用array.add()单独添加内容?


当前回答

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

其他回答

这就是如何使用op4j Java库(1.1。12月10日发布):-

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

这是一个非常酷的库,可以节省你大量的时间。

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

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

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

First, the elements are copied into the Arrays.ArrayList<T> created by the static factory Arrays.asList(T...). This does not the produce the same class as java.lang.ArrayListdespite having the same simple class name. It does not implement methods like remove(int) despite having a List interface. If you call those methods it will throw an UnspportedMethodException. But if all you need is a fixed-sized list, you can stop here. Next the Arrays.ArrayList<T> constructed in #1 gets passed to the constructor ArrayList<>(Collection<T>) where the collection.toArray() method is called to clone it. public ArrayList(Collection<? extends E> collection) { ...... Object[] a = collection.toArray(); } Next the constructor decides whether to adopt the cloned array, or copy it again to remove the subclass type. Since Arrays.asList(T...) internally uses an array of type T, the very same one we passed as the parameter, the constructor always rejects using the clone unless T is a pure Object. (E.g. String, Integer, etc all get copied again, because they extend 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;

因此,我们的数据被复制3x,只是为了显式地初始化数组列表。如果我们强制Arrays.AsList(T…)构造一个Object[]数组,我们可以把它降到2x,这样ArrayList以后就可以采用它,具体操作如下:

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

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

Yes.

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

这实际上是在创建一个派生自ArrayList<String>的类(外部花括号的功能),然后声明一个静态初始化器(内部花括号的功能)。这实际上是包含类的内部类,所以它有一个隐式This指针。这不是问题,除非你想序列化它,或者你希望外部类被垃圾收集。

我知道Java 7将提供额外的语言结构来完成您想要的工作。

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

这个怎么样?

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

在Java中,列表没有文字语法,所以你必须使用.add()。

如果你有很多元素,这有点啰嗦,但你可以:

使用Groovy或类似的东西 使用arrays . aslist(数组)

2看起来像这样:

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

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