Arrays.asList()创建的List上的remove()抛出UnsupportedOperationException

时间:2011-10-25 06:45:16

标签: java

我有一个集合c1<MyClass>和一个数组a<MyClass>。我正在尝试将数组转换为集合c2并执行c1.removeAll(c2),但这会抛出UnsupportedOperationException。我发现Arrays类的asList()返回Arrays.ArrayList类,此类继承removeAll()的{​​{1}},其实现抛出AbstractList()

UnsupportedOperationException

有没有办法删除元素?请帮忙

3 个答案:

答案 0 :(得分:152)

Arrays.asList返回一个数组周围的List包装器。此包装器具有固定大小,并由数组直接支持,因此对set的调用将修改数组,修改列表的任何其他方法将抛出UnsupportedOperationException

要解决此问题,您必须通过复制包装列表的内容来创建新的可修改列表。使用ArrayList

Collection构造函数很容易做到这一点
Collection c = new ArrayList(Arrays.asList(la));

答案 1 :(得分:13)

是的,Arrays.asList(..)是无法展开或缩小的集合(因为它由原始数组支持,并且无法调整大小)。

如果你想删除元素要么创建一个new ArrayList(Arrays.asList(..),要么直接从数组中删除元素(效率会更低,更难写)

答案 2 :(得分:7)

这就是Array.asList()的工作方式,因为它直接由数组支持。 要获得完全可修改的列表,您必须将集合克隆到由您自己创建的集合中。

Collection c = new ArrayList(Arrays.asList(la))