应该很多同学都碰到过,下面👇这种情况
asList()
方法接受的参数是一个泛型,而基本数据类型是无法泛型化的,这个是编译不通过(飘红)的原因
那么Arrays.asList(num);
输出的内容是什么呢?我们执行下面的代码看下
public static void main(String[] args) {
int[] num = {0, 1, 2, 3, 4, 5, 6};
List<int[]> ints = Arrays.asList(num);
System.out.println(ints);
}
执行结果
是一个地址,这是因为int[]
整体被当成参数,于是转换后的列表就只包含一个类型为int[]
的元素
而且值得注意的是Arrays.asList()
返回的列表只能读取,不能增删元素
原因是Arrays.asList()
返回的ArrayList
是Arrays
类中的一个内部类,而非java.util
包下的ArrayList
类
这个内部类中的全部方法如下图(没有add
、remove
等增删相关的方法)
所以在执行例如新增方法时会报错
如果想要进行元素的增删操作只需要只需要在外层再使用java.util.ArrayList
包装一层即可
ArrayList<Integer> newArr = new ArrayList<>(integerList);
解决方案
方法一
最简单,但需要额外引入其他依赖(com.google.common.primitives.Ints
)
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
谷歌的guava库中的Ints.asList()
方法可以把基本数据类型的数组直接转化为其包装类型的列表
int[] num = {0, 1, 2, 3, 4, 5, 6};
List<Integer> integerList = Ints.asList(num);
System.out.println(integerList);
方法二
使用流stream操作层(JDK版本在1.8以上),无需单独引入别的依赖,但使用范围有限制
int[] num = {0, 1, 2, 3, 4, 5, 6};
List<Integer> collect = Arrays.stream(num).boxed().collect(Collectors.toList());
System.out.println(collect);
执行结果
这个操作只支持3种基础类型的数组快速转为列表
int[]
long[]
double[]
其他例如byte[]
、char[]
等在JDK1.8中暂不支持(详见下图)
其他(上述三种以外)基础类型数组转列表
char[] -> List
char[] charArr = {'a', 'q', 'i', 'n'};
List<Character> charList = new String(charArr).chars().mapToObj(c -> (char) c).collect(Collectors.toList());
System.out.println(charList);
完整代码
public static void main(String[] args) {
int[] num = {0, 1, 2, 3, 4, 5, 6};
List<int[]> ints = Arrays.asList(num);
System.out.println(ints);
List<Integer> integerList = Ints.asList(num);
System.out.println(integerList);
ArrayList<Integer> newArr = new ArrayList<>(integerList);
newArr.add(8);
System.out.println(newArr);
List<Integer> collect = Arrays.stream(num).boxed().collect(Collectors.toList());
System.out.println(collect);
char[] charArr = {'a', 'q', 'i', 'n'};
List<Character> charList = new String(charArr).chars().mapToObj(c -> (char) c).collect(Collectors.toList());
System.out.println(charList);
}