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

我有一个集合c1<MyClass>和一个数组a<MyClass> 。 我试图将数组转换为集合c2并做c1.removeAll(c2) ,但是这会抛出UnsupportedOperationException 。 我发现Arrays类的asList()返回Arrays.ArrayList类,这个类从AbstractList()inheritanceremoveAll() ,它的实现抛出UnsupportedOperationExceptionexception。

  Myclass la[] = getMyClass(); Collection c = Arrays.asList(la); c.removeAll(thisAllreadyExistingMyClass); 

有什么办法去除元素? 请帮忙

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

要解决这个问题,你必须通过复制包装器列表的内容来创build一个新的可修改列表。 使用带CollectionArrayList构造函数很容易:

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

是的, Arrays.asList(..)是不能扩展或缩小的集合(因为它是由原始数组支持的,并且不能resize)。

如果你想删除元素,可以创build一个new ArrayList(Arrays.asList(..)或直接从数组中删除元素(这将是更低效率和更难写)

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

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