转的: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();
}
在做一个需求的时候,偶然发现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();
}