add、delete操作报UnsupportedOperationException的错
addAll操作报UnsupportedOperationException错误
上面的代码,粗粗一看发现,没有什么bug
String temp="1,2,3”;
List<String>list1 = Arrays.asList(temp.split(","));
list1.add("4");
可是报如下错误。就算报了错,也觉得没有错,难道list不能add吗?
后面才发现,其实不是不能add
,只要改变 list
大小的操作,都会报下面的错。
java.lang.UnsupportedOperationException
点进去看asList
的源码,发现asList
方法中返回了一个ArrayList
的对象。asList
的方法在java.util.Arrays
这个包中,在这个aslist
的方法的后面几行就是一个叫ArrayList
的内部类。
天啊,好坑啊。
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
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;
}
....
首先看出,asList
方法返回的ArrayList
只是java.util.Arrays
中的内部类,我们常用的new ArrayList
是java.util.Arraylist
.内部类中的ArrayList
继承了AbstractList
,但是并没有重写add
,remove
等方法,所以调用这些方法的时候调用的都是父类AbstractList
中的方法。
java.util.Arrays中的内部类
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
我们先看AbstractList
包下的ArrayList
中add
方法
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
他在这里直接就给抛异常了。C语言。
平常使用的java.util
包下的ArrayList
中add
方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
###所以,Arrays.asList()
返回的list
仅支持那些不会改变集合大小的操作。
如果要用的话,也可以如下使用:
List<String>list = new ArrayList<>(Arrays.asList(new String[]{"a", "b"}));
list.add("c");
System.out.println(list);
把Arrays.asList0
的结果作为构造器的参数传递给任何`Collection。这样就可以正常操作了