问题:

Arrays.asList将数组转换成集合,不可进行add,addAll和remove操作:

public static void main(String[] args) {
        List<String> strings = Arrays.asList("dddd", "dsad", "dsawe", "11111");
        strings.add("a");
        List strings1 = Arrays.asList("457", "999");
        strings.addAll(strings1);
        System.out.println(strings1.toString());
    }

Arrays.asList将数组转换成集合,不可进行add和remove操作的原因_List

原因:

查看源码:

Arrays.asList将数组转换成集合,不可进行add和remove操作的原因_java_02


继续往下查看:

Arrays.asList将数组转换成集合,不可进行add和remove操作的原因_java_03

new了一个ArrayList集合,注意了,这个可不是ArrayList类,而是Arrays里面的一个静态内部类;而该ArrayList类中并无add,remove等方法;

查看父类AbstractList源码:

Arrays.asList将数组转换成集合,不可进行add和remove操作的原因_List_04


发现当调用add,remove等方法时会走到父类的方法中,直接抛出异常!

结论:

用asList转换的代码是返回List的实现类ArrayList集合对象;但是集合大小固定,无法添加和删除。

解决办法:

将数组转换成一个可以具有正常添加和删除操作的List即可
比如:直接new ArrayList<…>(Arrays.asList(a))放入另一个ArrayList

public static void main(String[] args) {
        List<String> strings = new ArrayList<>(Arrays.asList("dddd", "dsad", "dsawe", "11111"));
        strings.add("a");
        List strings1 = Arrays.asList("457", "999");
        strings.addAll(strings1);
        System.out.println(strings.toString());
    }

也可以新建一个new ArrayList<>(),使用Collections.addAll(list, strings)或是for循环。