Arrays.asList()方法的坑
2018-03-01 本文已影响1人
何甜甜在吗
需求:快速将数组转化为集合,并且还能继续往里面添加元素
错误方法:
TestAsList.java
public class TestAsList {
public static void main(String[] args) {
String[] s = {"a", "b", "c"};
List<String> list = Arrays.asList(s);
System.out.println(list.toString());
list.add("d");
}
}
程序报错:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at myjava.TestAsList.main(TestAsList.java:13)
为什么报错:
首先看方法的源代码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
返回一个ArrayList,在Ctrl+B一下:
![](https://img.haomeiwen.com/i9358011/e1db77527338e339.jpg)
这个ArrayList并不是java.util.ArrayList,而是Arrays的一个内部类,它的add方法是在AbstractList类中,继续看源码:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
定位到异常抛出处了
就是不能添加元素,你添加我就给你抛异常
解决方法:使用ArrayList的构造方法:public ArrayList(Collection<? extends E> c)
修改以后的代码:
public class TestAsList {
public static void main(String[] args) {
String[] s = {"a", "b", "c"};
List<String> strings1 = new ArrayList<>(Arrays.asList(s));
strings1.add("d");
System.out.println(strings1.toString());
}
}
小结:我们不能对Arrays.asList()方法生成的ArrayList做修改数据结构的操作,比如add,再看remove()方法,也在AbstractList类中
public E remove(int index) {
throw new UnsupportedOperationException();
}
抛出异常,不让改。但是对于不改变数据结构的操作,比如set方法
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
是完全oj8k的