基础数据类型数组转List | ArrayList.asList() 参数的区别
今天在将一个int数组转换成List的时候,下意识就写出了如下代码
int[] data2 = {1,2,3,4};
Arrays.asList(data2);
但是我在用代码补全的时候,发现接受参数是List<int[]>,也就是
List<int[]> ints1 = Arrays.asList(data2);
按照我的预想,我应该得到的是一个List<Integer>的数组?
于是我测试了如下代码:
public static void main(String[] args) { Solution solution = new Solution(); Integer[] data = new Integer[]{1,2,3,4,5}; List<Integer> list = Arrays.asList(data); int[] data2 = {1,2,3,4}; List<int[]> ints1 = Arrays.asList(data2); System.out.println(ints1.size()); String[] str = {"fgx", "lzy"}; List<String> strings = Arrays.asList(str); System.out.println(strings.size()); }
asList()的源码如下:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
仔细观察可以发现asList接受的参数是一个泛型的变长参数,而基本数据类型是无法泛型化的,对于基本数据类型的数组,会将其作为一个对象,而对对象数组,会得到想要的结果。
上面就是因为把int类型的数组当参数了,所以转换后的列表就只包含一个int[]元素
正确方法如下:
public static void main(String[] args) { int[] data2 = {1,2,3,4}; // 使用guava工具包 List<Integer> t = Ints.asList(data2); // 通过JDK8的Stream流将3总基本类型数组转为List List<Integer> collect = Arrays.stream(data2).boxed().collect(Collectors.toList()); }