使用Arrays.asList()的坑

  1. 背景

    在将数组转为list的时候,一般会使用到Arrays.asList()这个方法,但是在对转化后的list进行add操作的时候出现了java.lang.UnsupportedOperationException的报错

  2. 原因

    Arrays.asList()方法只是将数组转换为一个固定长度的列表,它不支持增删操作。研究源码发现,它生成的ArrayList表面上看是 java.util.ArrayList,实际上是Arrays的内部类ArrayList 。它们的父类都是AbstractList,但是内部类的ArrayList是没有重写父类的add跟remove方法的。恰巧父类的add跟remove方法是直接抛出UnsupportedOperationException异常的,所以在使用该方法后再去add的时候就会报java.lang.UnsupportedOperationException了

    1. 解决方法及拓展

    解决方法:将其再转化一次,即为List list = new ArrayList<>(Arrays.asList(array));这样就是一个标准的ArrayList了。

    拓展:Arrays.asList() 方法不能直接用于基本类型数组,因为泛型不支持基本类型。如果尝试将基本类型数组作为参数传递给 Arrays.asList(),它会将整个基本类型数组视为单个对象来处理

    int[] array = {1, 2, 3};
    List<int[]> list = Arrays.asList(array);
    
    System.out.println(list.size());       // 这里是把这个int类型的数组作为泛型,故输出 1
    System.out.println(list.get(0)[0]);    // 抛出 ArrayIndexOutOfBoundsException

    解决办法是手动将基本类型数组转换为对应的包装类型,然后再使用,即List<Integer> list = Arrays.asList(array);

     

posted @ 2024-05-11 16:40  写字楼间写字员  阅读(2)  评论(0编辑  收藏  举报