Java 数组创建的列表上的remove()。asList()引发UnsupportedOperationException

Java 数组创建的列表上的remove()。asList()引发UnsupportedOperationException,java,Java,我有一个集合c1和一个数组a。我试图将数组转换为集合c2并执行c1。移除所有(c2),但这会引发不支持操作异常。我发现Arrays类的asList()返回Arrays.ArrayList类,而这个类继承了AbstractList()中的removeAll(),它的实现抛出了UnsupportedOperationException Myclass la[] = getMyClass(); Collection c = Arrays.asList(la); c.remove

我有一个集合
c1
和一个数组
a
。我试图将数组转换为集合
c2
并执行
c1。移除所有(c2)
,但这会引发
不支持操作异常。我发现Arrays类的
asList()
返回
Arrays.ArrayList
类,而这个类继承了
AbstractList()
中的
removeAll()
,它的实现抛出了
UnsupportedOperationException

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

有没有办法去除这些元素?请帮助
数组。asList
返回数组周围的
列表
包装。此包装具有固定的大小,并且直接由数组支持,因此对
set
的调用将修改数组,任何其他修改列表的方法都将抛出
不支持操作异常

要解决这个问题,您必须通过复制包装器列表的内容来创建一个新的可修改列表。通过使用接受集合的
ArrayList
构造函数,这很容易做到:

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

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

要解决这个问题,您必须通过复制包装器列表的内容来创建一个新的可修改列表。通过使用接受集合的
ArrayList
构造函数,这很容易做到:

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

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


如果要删除元素,请创建一个
新的ArrayList(Arrays.asList(..)
或直接从数组中删除元素(这将降低效率并更难写入)

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


如果要删除元素,请创建一个
新的ArrayList(Arrays.asList(..)
或直接从数组中删除元素(这样效率更低,更难写入)

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

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

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

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

+1这个答案是唯一正确的:Arrays.asList()返回一个不可修改的列表-这就是引发异常的原因。这与“由数组支持”等无关。所有ArrayList都由数组支持-这很重要。但是如果你深入阅读文档,你会发现它实际上不是不可修改的。。。“返回一个由指定数组支持的固定大小的列表。(对返回列表的更改“写入”到数组。)”-1,Etienne说得很对。@Steven是的,这就是为什么它说“固定大小”而不是“不可修改”或“只读”“。事实上,我现在就去编辑我的答案以反映这一点。@Bohemian,返回的集合实际上是“可修改的”,因为可以调用“set”方法。如果你想挑这样的毛病,不妨说一些乏味的话,比如“它抛出UnsupportedOperationException,因为代码中有一个抛出UnsupportedOperationException语句“。API的使用者不关心哪个AbstractBlah超类引发异常,他们关心他们使用的类的约定和期望是什么。在JVM v+1中,类库完全可能在引发异常的位置发生更改,但约定不会更改。+1这个答案是唯一正确的:Arrays.asList()返回一个不可修改的列表-这就是引发异常的原因。这与“由数组支持”等无关。所有ArrayList都由数组支持-这很重要。但是如果您进一步阅读文档,您会发现它实际上不是不可修改的…”返回一个由指定数组支持的固定大小的列表。(对返回列表的更改“写入”到数组。)“-1,Etienne说得很对。@Steven是的,这就是为什么它说“固定大小”,而不是“不可修改”或“只读”。事实上,我现在就去编辑我的答案以反映这一点。@Bohemian,返回的集合实际上是“可修改的”,因为可以调用“set”方法。如果你想挑这样的毛病,不妨说一些乏味的话,比如“它抛出UnsupportedOperationException,因为代码中有一个抛出UnsupportedOperationException语句“。API的使用者不关心哪个AbstractBlah超类引发异常,他们关心他们使用的类的约定和期望是什么。在JVM v+1中,类库完全可能在引发异常的位置发生更改,但约定不会更改。+1这个答案是唯一正确的:Arrays.asList()返回一个不可修改的列表-这就是引发异常的原因。这与“由数组支持”等无关。所有ArrayList都由数组支持-这很重要。但是如果您进一步阅读文档,您会发现它实际上不是不可修改的…”返回一个由指定数组支持的固定大小的列表。(对返回列表的更改“写入”到数组。)“-1,Etienne说得很对。@Steven是的,这就是为什么它说“固定大小”,而不是“不可修改”或“只读”。实际上,我现在就去编辑我的答案以反映这一点。@Bohemian,返回的集合实际上是“可修改的”,因为可以调用“set”方法。如果