arrays

sparkle6666 2014-10-10 12:40:24
String[] arr = new String[] {"1", "2"};
List<String> list = Arrays.asList(arr);

for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
list.add("t");
list.add("p");
为什么add方法报错?
...全文
209 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxq_xsyu 2014-10-11
  • 打赏
  • 举报
回复
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方法,抛出异常(不支持该操作)
rockets311 2014-10-10
  • 打赏
  • 举报
回复
Mark一下,以前还真没注意过。
csucaicai 2014-10-10
  • 打赏
  • 举报
回复
源码:
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。
-江沐风- 2014-10-10
  • 打赏
  • 举报
回复
这个问题需要注意: 这里的ArrayList不是java.util.ArrayList,而是Arrays类的一个内部类(可以看asList方法的源代码); 虽然也可以用List访问,不过不能对其进行修改,即只读; 所以对Arrays.asList出来的List,对其做add、remove操作都会抛出UnsupportedOperationException异常; 其实java.util.Arrays.ArrayList其实只是对数组做了一个装饰,目的只是提供了可以像访问List那样来访问数组而已,本质上其实还是一个数组; 最好看一下这个Arrays类的源代码,里面写的很详细,也很清楚;

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧