【填坑向】关于基本数据类型的数组Array转化为列表List的跳坑指南

648 阅读2分钟

应该很多同学都碰到过,下面👇这种情况

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()返回的ArrayListArrays类中的一个内部类,而非java.util包下的ArrayList

这个内部类中的全部方法如下图(没有addremove等增删相关的方法)

所以在执行例如新增方法时会报错

如果想要进行元素的增删操作只需要只需要在外层再使用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);
}