Java 中存在两种数组类型,一个是对象数组类型,如字符串数组 String[],还有一个是基本类型数组,如 int[],那么如何将这类数组转化为 List<T> 列表对象,有很多种方式,而且它们有不同的使用场景,需要开发者了解其内在原理,这里还同时介绍 java8、java9、java10 等高版本的实现。
对象数组转列表
Collections.addAll(推荐方式)
如果 jdk 1.5 版本以上,推荐如下方法,且返回的列表对象,可以进行数据的增删改查操作:
String[] strings = new String[]{"a", "b", "c"};
List<String> list = new ArrayList<>(strings.length);
Collections.addAll(list, strings);
Arrays.asList(strings)(不可变列表)
java 数组工具类 Arrays
提供的静态方法 asList(T... a)
可以将对象数组转换为 List
,但是需要注意的是,它返回的 ArrayList
不是 java.util.ArrayList
,而是 Arrays
内部的实现类 ArrayList
,它存放数据的 field 是 final
类型修饰的,即数组一旦赋值后,不可改变;如果进行增删改查操作,会报 java.lang.UnsupportedOperationException
异常。
List<String> list = Arrays.asList(strings);
如果非要用 Arrays.asList,还要继续增删改查操作,那就可以稍微调整成如下:
List<String> list = new ArrayList<>(Arrays.asList(strings));
stream 流(java 8)
java 8 开始 Arrays
工具类提供了 stream
方法,可以进行流式操作:
List<String> list = Arrays.stream(strings).collect(Collectors.toList());
这种方式返回的 list 是可变的列表。
如果非要返回 ArrayList 类型,可以如下操作:
ArrayList<String> list = Arrays.stream(strings)
.collect(Collectors.toCollection(ArrayList::new));
List.of(java 9,不可改变列表)
java 9 List 接口提供了 of
方法,可以将对象数组转换为不可改变的列表。
List<String> list = List.of(strings);
java 10 两种方式
List<String> list = List.copyOf(Arrays.asList(strings));
List<String> list = Arrays.stream(strings).collect(Collectors.toUnmodifiableList());
基本类型数组转列表
stream 流 boxed 方法(java 8)
java 8 中基本类型流(primitive streams)可以使用 boxed
方法转换为 boxed 类型流,然后再进一步 collect
成对应的列表。
int[] ints = new int[]{1, 2, 3};
List<Integer> list = Arrays.stream(ints)
.boxed()
.collect(Collectors.toList());
基本类型工具类(guava)
google 的 guava 库为 java 的基本类型提供了转换的方法,如 Ints.asList
,Longs.asList
,Doubles.asList
等,8 个基本类型都对应工具类,且都调用 asList
方法,返回不可变的列表。
import com.google.common.primitives.Ints;
List<Integer> list = Ints.asList(ints);
如果要转成可变列表,则如下:
List<Integer> list = new ArrayList<>(Ints.asList(ints));