原创

使用一行代码初始化ArrayList

1. 问题
问题来源:当创建一个List并且塞入一串测试数据的时候,我需要下面这种代码来完成

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

可以使用下面的代码来完成

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

但是有没有更好的方式呢?
2. 答案一
其实上面最开始的写法可能就是最好的,它不需要创建新的list对象,不需要转换,所有的操作都指向原有的对象实例。

当然,有一些替代方法,例如使用实例初始化器(也称为双括号初始化)来创建一个匿名内部类:

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

但是这种方法不太好,仅仅是为了创建一个ArrayList,{}中又创建了一个ArrayList的实例对象,有些浪费。
如果按照下面的方式可以初始化就好了,但是很不幸,这种方式是错误的;

List<Stringlist = ["A", "B", "C"];

一方面它返回的是一个固定的List,更主要的,这种写法编译器无法通过。
3. 答案二
如果你不需要一个ArrayList,仅仅需要一个List,那么你可以这么做

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

或者你只有一个对象需要初始化

List<Stringplaces = Collections.singletonList("Buenos Aires");

当然这两种方式返回的是List对象,你无法动态操作,如果你确实需要ArrayList,那么可能需要下面的方式

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

4. 答案其他
在Java9中可以使用这种方式

List<Stringstrings = List.of("foo", "bar", "baz");
正文到此结束
本文目录