base

转的:http://xtu-xiaoxin.iteye.com/blog/662935?page=1#comments
在做一个需求的时候,偶然发现Arrays.asList(T... a)这个方法返回的list的removeAll方法总是抛出UnsupportedOperationException异常,但是直接使用ArrayList的对象则能正常运行。

查看源码发现Arrays.asList(T... a)这个方法返回的对象是java.util.Arrays$ArrayList<E>的实例,而并非 java.util.ArrayList<E>的实例。Arrays.asList(T... a)这个方法的源码如下:

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);// ArrayList<T>是Arrays的内部类。

}

java.util.Arrays$ArrayList的定义如下:

private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
        private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
     a = array;
}

...

}

该内部类没有真正实现removeAll()方法,它继承了 java.util.AbstractCollection<E>的removeAll()方法,该方法实际上还是调用remove()方法。java.util.AbstractList<E>的remove()方法如下:

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

你可能感兴趣的:(java,Blog)