在一行中初始化数组列表

我想创建一个用于测试目的的选项列表。起初,我这样做:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

然后,我按如下方式重构了代码:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

有没有更好的方法来做到这一点?


答案 1

如果您只是将其声明为 - 它必须是ArrayList吗?List

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

或者,如果您只有一个元素:

List<String> places = Collections.singletonList("Buenos Aires");

这意味着它是不可变的(尝试更改它将导致引发异常)。placesUnsupportedOperationException

要创建一个具体的可变列表,您可以从不可变列表中创建一个:ArrayListArrayList

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

并导入正确的包:

import java.util.Arrays;

答案 2

实际上,初始化的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的方法:ArrayListList

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

问题是,引用该实例需要相当多的键入。list

还有其他替代方法,例如使用实例初始值设定项创建匿名内部类(也称为“双括号初始化”):

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

但是,我不太喜欢这种方法,因为你最终得到的是一个子类,它有一个实例初始值设定项,而创建该类只是为了创建一个对象 - 这对我来说似乎有点过分了。ArrayList

如果 Project CoinCollection Literals 提案被接受(它计划在 Java 7 中引入,但它也不太可能成为 Java 8 的一部分),那就太好了:

List<String> list = ["A", "B", "C"];

不幸的是,它不会在这里帮助你,因为它会初始化一个不可变的而不是一个,而且,如果有的话,它还不可用。ListArrayList