一尘不染

Java 在一行中初始化ArrayList

java

我想创建用于测试目的的选项列表。首先,我这样做:

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"));

有一个更好的方法吗?


阅读 424

收藏
2020-02-27

共2个答案

一尘不染

实际上,初始化的“最佳”方法可能ArrayList是你编写的方法,因为它无需以List任何方式创建新方法:

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 Coin的Collection Literals提案(原定于Java 7中引入,但也不太可能成为Java 8的一部分),那将是一个很好的选择:

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

不幸的是,它不会在这里为你提供帮助,因为它将初始化一个不可变变量,List而不是一个ArrayList,并且,如果有的话,它尚不可用。

2020-02-27
一尘不染

如果仅将其声明为List-它将必须是ArrayList 会更简单。

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

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

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

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

ArrayList创建一个具体的可变列表,你可以ArrayList从不可变列表中创建一个:

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