您的位置:首页 > 编程语言 > Java开发

将数组转为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在抽象类中没有制造异常,也没有重写,为什么也会抛出异常,暂不清楚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java list