将数组转为List的方法,转换后不可执行List的哪些操作?
2017-03-15 16:11
483 查看
方法一
String[] arr={"a","b","c","d"}; List<String> list=new ArrayList<>(); Collections.addAll(list, arr);
方法二
String[] arr={"a","b","c","d"}; List<String> list=new ArrayList<>(arr.length); for(int i=0;i<arr.length;i++){ list.add(arr[i]); }
方法三
String[] arr={"a","b","c","d"}; List<String> list=Arrays.asList(arr);
第三种方法执行add(E e),add(int index,E e),remove(int index),clear()等方法会报UnsupportedOperationException异常。
原因如下:
问题分析
查看asList(T… a)方法源码可知:public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
看起来并没有什么问题,直接返回一个传一个参的ArrayList()实例,但是,看API可知,ArrayList中有个构造ArrayList(int initialCapacity),作用是:构造一个具有指定初始容量的空列表。显然,在这里传入的是一个数组。因此,此ArrayList并非彼ArrayList。继续查看这个ArrayList源码:
public class Arrays { ... 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); } ... } }
这个ArrayList是Arrays的私有静态内部类,同样继承了AbstractList抽象方法。看这个ArrayList的构造可知,这里仅仅是判断了一下数组是否为空引用,就直接返回给E[] a数组了,存储结构并没有发生变化,还是一个数组类型。看源码发现并没有add,clear等方法,那么看继承的抽象类AbstractList源码:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { ... public boolean add(E e) { add(size(), e); return true; } public E set(int index, E element) { throw new UnsupportedOperationException(); } public void add(int index, E element) { throw new UnsupportedOperationException(); } public E remove(int index) { throw new UnsupportedOperationException(); } public void clear() { removeRange(0, size()); } ... }
这个ArrayList并没有对add,remove,clear方法重写,,但重写了set方法,,所以会抛出UnsupportedOperationException异常。
clear在抽象类中没有制造异常,也没有重写,为什么也会抛出异常,暂不清楚。
相关文章推荐
- PHP数组的初始化 访问数组 数组操作符 多维数组的排序 对数组重新排序 从文件载入数组的方法 数组其他有用的操作 统计数组个数 将数组转换称标量变量 extract()
- 关于数组和List之间相互转换的方法
- Arrays.asList方法返回的List不能执行add、remove操作
- 把int数组转换成list的小方法
- java中数组与List相互转换的方法
- java中数组与List相互转换的方法
- Java中list集合的交集和差集的用法和如何将数组转换为集合的方法
- java中数组与List相互转换的方法
- 把传过来的Object对象转换成Collection类型的对象。isArray()方法,判定此Class对象是否表示一个数组类。java.lang.reflect.Array 对任意数组进行操作
- java中数组与List相互转换的方法 .
- 关于数组和List之间相互转换的方法
- 基本类的数组利用Arrays.asList方法转换成list
- 关于数组和List之间相互转换的方法
- 数组转换为List的三种方法
- 关于数组和List之间相互转换的方法
- 关于数组和List之间相互转换的方法
- 关于数组和List之间相互转换的方法
- List对象转换成Json数组的方法
- 关于数组和List之间相互转换的方法
- [java]关于数组和List之间相互转换的方法