Arrays.asList避坑

​ 今天在开开心心写代码的时候,对一个List进行add操作时突然提示 UnsupportedOperationException 错误,一开始还以为是我add的参数不对,调试了半天,后来想想,这报错和参数类型没有半毛钱关系啊,该错误翻译过来是__不支持的操作类型__,真想抽自己俩巴掌,没仔细审题。然后去网上查了下这个错误,搞明白了这个错误产生的原因。

​ 产生这个错误主要是因为List中的add()方法没有被重写,然后查看代码发现,我调用的List是通过 Arrays.asList(String []) 方法生成的,这个方法的作用主要是根据传入的数组,生存对应的List集合,生成的集合是Arrays类中的一个内部类,并没有重写继承自父类AbstractListadd()remove()方法,而在没有重写add()的情况下,AbstractList中的add()方法是默认抛出一个__UnsupportedOperationException__。

​ 解决方案:将其转换成java.util.ArrayList,这个ArrayList是重写了add()方法的,我们可以放心大胆使用。

	List<String> foo = new ArrayList<String>(Arrays.asList(String []));

​ 接下来我们看一下ArrayList的构造方法

    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

​ 我们可以发现,该构造方法会调用toArray()方法将传入的集合转换成Object[]类型,并存入__elementData__变量中,如果转换后的数据类型不是Object[]类型,则会将其拷贝成Object[]类型并存入__elementData__变量中。

​ 所以说,有问题,第一时间看看源码,说不定就懂了。


最后修改于 2018-07-20