Arrays$ArrayList转java.util.ArrayList

前两天遇到一个问题,要对一个集合的某个值进行删除操作。我以前有过总结,删除List的某个原色,最好用for i 这种遍历形式,因为它是单线程的。(见①)

正常的new 出来的List删除是没问题的。但是用Arrays转化成的ArrayList,就出现问题了。

public static void test1(){
        List typeList = Arrays.asList("1,2,3,4".split(","));
        for (int i = 0; i < typeList.size(); i++) {
            String type = typeList.get(i);
            if("3".equals(type)){
                typeList.remove(i);
            }
        }

        System.out.println(typeList);
    }

执行报错

Arrays$ArrayList转java.util.ArrayList_第1张图片

实际上,Arrays.asList方法返回的对象是Arrays的内部类ArrayList的实例,即Arrays$ArrayList。Arrays$ArrayList没有重写remove方法,所以,删除时,会调用基类的remove方法:

public E remove(int index) {
        throw new UnsupportedOperationException();
    }

然后抛出java.lang.UnsupportedOperationException异常。

知道这个原理,那就好解决了。我们只需要再将Arrays$ArrayList对象放入java.util.ArrayList中即可,如下:

public static void test1(){
        List typeList = Arrays.asList("1,2,3,4".split(","));
        typeList = new ArrayList<>(typeList);
        for (int i = 0; i < typeList.size(); i++) {
            String type = typeList.get(i);
            if("3".equals(type)){
                typeList.remove(i);
            }
        }

        System.out.println(typeList);
    }

Perfect!

输出:[1, 2, 4]

 

 

 

你可能感兴趣的:(java)