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

jav*_*ner 86 java

我有一个集合c1<MyClass>和一个数组a<MyClass>.我试图将数组转换为集合c2并做c1.removeAll(c2),但这引发了UnsupportedOperationException.我发现asList()Arrays类返回了Arrays.ArrayList类,并且该类继承了其实现抛出的removeAll()from .AbstractList()UnsupportedOperationException

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);
Run Code Online (Sandbox Code Playgroud)

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

Eti*_*tel 161

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

要解决此问题,您必须通过复制包装列表的内容来创建新的可修改列表.使用ArrayList构造函数很容易做到Collection:

Collection c = new ArrayList(Arrays.asList(la));
Run Code Online (Sandbox Code Playgroud)

  • +1指出它实际上不可修改. (16认同)
  • 我正在查看 `java.util.Arrays` `asList()` 方法的源代码,它似乎返回一个 `ArrayList`。但是,当我执行 `System.out.println(list.getClass());` 时,我得到 `class java.util.Arrays$ArrayList`。所以它使用内部的 `ArrayList` 类,它没有 `add` 或 `remove` 方法。我只是想知道拥有一个内部的 `ArrayList` 类而不是使用 `java.util.ArrayList` 类有什么意义,为什么没有一个 `add()` 和 `remove()` 方法? (2认同)

Boz*_*zho 13

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

如果要new ArrayList(Arrays.asList(..)删除元素,请直接从数组创建或删除元素(效率较低,写入较难)

  • 如果你要选择那样的nits,你可能会说"它抛出UnsupportedOperationException,因为代码中有一个抛出UnsupportedOperationException语句"这样的无聊事物.API的消费者不关心哪个AbstractBlah超类抛出异常,他们关心他们使用的类的合同和期望是什么.在JVM v + 1中,类库完全有可能在抛出异常的地方发生变化 - 但合同不会改变. (2认同)

hen*_*nko 7

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

Collection c = new ArrayList(Arrays.asList(la))
Run Code Online (Sandbox Code Playgroud)