这个问题需要注意:这里的ArrayList不是java.util.ArrayList,而是Arrays类的一个内部类(可以看asList方法的源代码);虽然也可以用List访问,不过不能对其进行修改,即只读;所以对Arrays.asList出来的List,对其做add、remove操作都会抛出UnsupportedOperationException异常;其实java.util.Arrays.ArrayList其实只是对数组做了一个装饰,目的只是提供了可以像访问List那样来访问数组而已,本质上其实还是一个数组;最好看一下这个Arrays类的源代码,里面写的很详细,也很清楚;

解决方案 »

  1.   

    源码:
        public static <T> List<T> asList(T... a) {
            return new ArrayList<>(a);
        }
    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) {
                a = Objects.requireNonNull(array);
            }        @Override
            public int size() {
                return a.length;
            }        @Override
            public Object[] toArray() {
                return a.clone();
            }        @Override
            @SuppressWarnings("unchecked")
            public <T> T[] toArray(T[] a) {
                int size = size();
                if (a.length < size)
                    return Arrays.copyOf(this.a, size,
                                         (Class<? extends T[]>) a.getClass());
                System.arraycopy(this.a, 0, a, 0, size);
                if (a.length > size)
                    a[size] = null;
                return a;
            }        @Override
            public E get(int index) {
                return a[index];
            }        @Override
            public E set(int index, E element) {
                E oldValue = a[index];
                a[index] = element;
                return oldValue;
            }        @Override
            public int indexOf(Object o) {
                if (o==null) {
                    for (int i=0; i<a.length; i++)
                        if (a[i]==null)
                            return i;
                } else {
                    for (int i=0; i<a.length; i++)
                        if (o.equals(a[i]))
                            return i;
                }
                return -1;
            }        @Override
            public boolean contains(Object o) {
                return indexOf(o) != -1;
            }        @Override
            public Spliterator<E> spliterator() {
                return Spliterators.spliterator(a, Spliterator.ORDERED);
            }
        }
      在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。
      

  2.   

    Mark一下,以前还真没注意过。
      

  3.   

    java.util.ArrayList和java.util.Arrays.ArrayList都是继承自AbstractList, 在Abstractlist中的add方法中直接抛出异常如下:
        public void add(int location, E object) {
            throw new UnsupportedOperationException();
        }
    java.util.Arrays.ArrayList没有重写add方法所以会直接调用父类的add方法,抛出异常(不支持该操作)