Java代码中,初始化 List 是常见操作,如何用最少的代码初始化 ArrayList 并赋值?
基础版
如果需要初始化一个List,最快想到的办法:
ArrayList<String> name = new ArrayList<String>();
name.add("Angla");
name.add("Bob");
name.add("Cris");
扩展版
使用Arrays
来创建一个 list,然后再使用ArryList
来初始化:
ArrayList<String> name = new ArrayList<String>(
Arrays.asList("Angla", "Bob", "Cris"));
代码简化了不少,和基础版效果一样,不过使用Arrays
额外带来了一定的开销。
匿名内部类
采用匿名内部类初始化ArrayList,减少了一丁点儿代码,但是理解起来困难了些。
ArrayList<String> list = new ArrayList<String>() {{
add("Angla");
add("Bob");
add("Cris");
}};
虽然少了一点点代码,但是内部类需要慎用:Java编译器会把所有的类,包括内部类都会单独生成.class
文件,加载这些‘多余的类’,类加载器可有的忙了。
初始化成List
用Arrays
可以简单地创建list
,但是不能成为ArrayList
。
List<String> name = Arrays.asList("Angla", "Bob", "Cris");
代码虽然简单,但是这个List
可不是你以为的那个List
,该List是不可变的,生成的list不能增加或删除元素。因为Arrays
工具类中实现了自己的ArrayList
,但是只实现了部分关键的方法。
一个元素的List
如果只有一个元素,可以使用下面的方式初始化:
List<String> name = Collections.singletonList("Buenos");
Collections
类中实现了SingletonList
,它没有实现全部的方法,生成List是不可变集合,生成的list不能增加或删除元素(会导致UnsupportedOperationException
异常)。
Java 8
Java 8 引入了 Stream API,可以使用下面的方式初始化List
:
List<String> strings = Stream.of("Angla", "Bob", "Cris").collect(toList());
虽然显得长了些,但实际上,可以用下面的方式:
Stream<String> strings = Stream.of("Angla", "Bob", "Cris");
毕竟,用stream
可以轻松地转换为 List ,并且可以做List
能做的任何事情。
Java 9
Java 9 扩充了List
,可以使用下面的方式来初始化List
:
List<String> name = List.of("Angla", "Bob", "Cris");
该List是不可变集合,生成的list不能增加或删除元素。
Java 10
Java 10 的类型推断,可以简化代码:
var name = List.of("Angla", "Bob", "Cris");
该List是不可变集合,生成的list不能增加或删除元素。
Guava
如果项目中引入了 Guava包,可以采用下面的方式:
ArrayList<String> name = Lists.newArrayList("Angla", "Bob", "Cris");
一行代码,生成可变集合ArrayList
,满足所有需求。缺点就是要多加一个外部依赖。