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”方法。如果