# Arrays.asList 返回的list 不能使用 add,set,remove 方法
来源:互联网 发布:mac照片图库怎么导出 编辑:程序博客网 时间:2024/05/16 08:36
Arrays.asList 返回的list 不能使用 add,set,remove 方法
使用Arrays.asList 返回的list 我们进行add,remove方法是会报UnsupportedOperationException异常,直接上源码更好理解。Arrays中asList方法,返回的是ArrayListpublic static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
下面看下ArrayList 这个类是怎么实现的
实际上Arrays.asList 返回的ArrayList 是Arrays的一个内部类,继承AbstractList抽象类并实现了RandomAccess, java.io.Serializable 两个接,ArrayList 并没有实现AbstractList 中的add,set,remove方法,下面是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) { 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) { E[] a = this.a; 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); } @Override public void forEach(Consumer<? super E> action) { Objects.requireNonNull(action); for (E e : a) { action.accept(e); } } @Override public void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(operator); E[] a = this.a; for (int i = 0; i < a.length; i++) { a[i] = operator.apply(a[i]); } } @Override public void sort(Comparator<? super E> c) { Arrays.sort(a, c); }}下面看下AbstractList 类中对这三个方法怎么实现,在107行的add方法中调用的是147行的add(int index, E element) ,而add(int index, E element)方法没有做任何操作,直接抛出了UnsupportedOperationException异常public boolean add(E e) { add(size(), e); return true;}public void add(int index, E element) { throw new UnsupportedOperationException();}
同样set方法,remove方法也是直接抛出异常public E set(int index, E element) { throw new UnsupportedOperationException(); public E remove(int index) { throw new UnsupportedOperationException();}
可以看出通过Arrays.asList 获取的list是只读的是不可修改的,所以可谓在使用的时候慎用。如果想用这个方式当然也有解决办法,只需要new ArrayList 即可,如下: List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
阅读全文
0 0
- # Arrays.asList 返回的list 不能使用 add,set,remove 方法
- Arrays.asList() 返回的list不能add,remove
- Arrays.asList() 返回的list不能add,remove
- Arrays.asList()返回的List不能add和remove
- Arrays.asList方法返回的List不能执行add、remove操作
- Arrays.asList() 返回的list不能add,remove以及慎用java.util.Collections.copy()方法
- Arrays.aslist新建的list集合不能add(),set(),remove()你知道吗?
- Arrays.asList获取的list不可以直接使用remove
- Arrays.asList不能remove、add等,抛UnsupportedOperationException
- 为什么Arrays.asList(T...t)不能add和remove?
- Arrays.asList()为什么不能支持add()和remove()
- Arrays.asList()返回的List特点
- Arrays.asList()返回只读的List
- 为什么Java里的Arrays.asList不能用add和remove方法?
- 为什么Java里的Arrays.asList不能用add和remove方法?
- 10062---为什么Java里的Arrays.asList不能用add和remove方法?
- 为什么Java里的Arrays.asList不能用add和remove方法?
- 使用Arrays的asList方法将数组变成List集合
- dubbo-admin编译笔记
- 欢迎使用CSDN-markdown编辑器
- 数理逻辑习题集(5)
- 手动构建rootfs及文件功能分析
- 递归修改当前目录下所有文件/文件夹3个时间戳
- # Arrays.asList 返回的list 不能使用 add,set,remove 方法
- mybatis原理解析
- VS2013设置生成的EXE文件的版本号等信息
- Object源码解析
- mt2503三合一vibrator如何调整振动强度
- H264码流结构分析
- Linux list
- VCSA 6.5 HA配置 之一:架构概览
- oracle程序包