我有一个集合c1<MyClass>
和一个数组a<MyClass>
。我正在尝试将数组转换为集合c2
并执行c1.removeAll(c2)
,但这会抛出UnsupportedOperationException
。我发现Arrays类的asList()
返回Arrays.ArrayList
类,此类继承removeAll()
的{{1}},其实现抛出AbstractList()
。
UnsupportedOperationException
有没有办法删除元素?请帮忙
答案 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))