Java List无法删除元素;List.remove(Obj)异常;UnsupportedOperationException异常

559 阅读1分钟

先来看一段代码

public void func(String src) {
    String string = "abc,def,ghi,jkl,mno,pqr"
    List<String> words = Arrays.asList(string.split(","));
    words.removeIf(word -> word.equals(src));
}

上面这段代码就是将数组拆成List,随后删除其中等于src的部分。 这段代码抛出了异常UnsupportedOperationException,经查发现是如下位置抛出了异常。这就很奇怪了,为什么没有实现remove方法呢? 到这里,我们可以从List方面入手,看一下Arrays.asList()方法是如何构造一个list的。

/**
 * Returns a fixed-size list backed by the specified array.
 * 返回由指定数组构成的固定大小的列表。
 * ...
 */
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

这个固定大小的意思就是指长度无法变换,也就是不能增删。 为了解决这个问题,我们可以尝试用一层LinkedList来包起来,如下:

List<String> words = new LinkedList<>( Arrays.asList( string.split(",") ) );

通过这样变换之后就可以生成一个可变长度的list,也就可以支持增删的操作了。

注意:通常情况下,当看到UnsupportedOperationException异常抛出时,表示某些代码正在尝试修改不可调整大小或不可更改的集合。