先来看一段代码
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异常抛出时,表示某些代码正在尝试修改不可调整大小或不可更改的集合。