使用Arrays.asList()的坑
-
背景
在将数组转为list的时候,一般会使用到Arrays.asList()这个方法,但是在对转化后的list进行add操作的时候出现了java.lang.UnsupportedOperationException的报错
-
原因
Arrays.asList()方法只是将数组转换为一个固定长度的列表,它不支持增删操作。研究源码发现,它生成的ArrayList表面上看是 java.util.ArrayList,实际上是Arrays的内部类ArrayList 。它们的父类都是AbstractList,但是内部类的ArrayList是没有重写父类的add跟remove方法的。恰巧父类的add跟remove方法是直接抛出UnsupportedOperationException异常的,所以在使用该方法后再去add的时候就会报java.lang.UnsupportedOperationException了
- 解决方法及拓展
解决方法:将其再转化一次,即为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);