使用iterator.remove()时出现UnsupportedOperationException

24

我试图从一个List中移除一些元素,但即使是像这个答案这个中的最简单的示例也无法正常工作。

public static void main(String[] args)
{
    List<String> list = Arrays.asList("1", "2", "3", "4");
    for (Iterator<String> iter = list.listIterator(); iter.hasNext();)
    {
        String a = iter.next();
        if (true)
        {
            iter.remove();
        }
    }
}

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(Unknown Source)
    at java.util.AbstractList$Itr.remove(Unknown Source)

使用普通的Iterator而不是ListIterator并没有帮助。我错过了什么?我正在使用Java 7。

使用正常的Iterator而不是ListIterator并不能提供帮助。我错过了什么吗?我在使用Java 7。

3个回答

47

Arrays.asList() 返回由原始数组支持的列表。您对列表所做的更改也会反映在您传入的数组中。因为您无法向数组添加或删除元素,所以也无法通过这种方式创建的列表进行添加或删除元素,这就是为什么您的remove 调用失败的原因。

如果您想能够动态添加和删除元素,则需要使用不同的List实现(例如ArrayListLinkedList等)。


像Java这样的静态安全面向对象语言的整个重点不就是不支持超类方法的子类吗? - Yamcha
@Yamcha 是的...Java并不是一种设计非常好的语言。如果你正在寻找替代方案,我建议使用Scala。 - Dima
嗯,我不会说Java不是一门设计良好的语言,但我认为你肯定可以争论有一些奇怪的妥协(原始类型),以及其他像泛型这样的附加功能,尽管经过了数月甚至数年的反复设计和讨论,但仍存在一些缺点,就像这个例子所展示的那样... - michaelok
@michaelok 嗯,这可能是个品味问题 :) 如果你认为在核心库接口上定义一个抛出运行时异常以报告缺少实现的方法是“设计良好”的话,那么Java就是这样的! :) - Dima
刚刚意识到List是一个接口,它具有一个抽象的remove方法 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html#remove(java.lang.Object) - Deep Roy

34

这只是Arrays.asList()的一个特性,并且此前已经有人提出过,请参见此问题

您可以将其包装在新列表中

List list = new ArrayList(Arrays.asList("1",...));

-2

创建一个新的列表,将您想要删除的元素放入其中,然后调用removeAll方法。

List<Object> toRemove = new ArrayList<Object>();
for(Object a: list){
    if(true){
        toRemove.add(a);
    }
}
list.removeAll(toRemove);

如果您对此内容进行负面评价,请至少提供一个原因,以便他们知道问题所在。 - Ascalonian
1
不是下投票者,但 removeAll() 是在 AbstractCollection 中实现的,并使用 Iterator.remove()。因此,如果 Iterator.remove() 不起作用,则 removeAll() 也无法正常工作。 - Florent Bayle
@Ascalonian 列举所有错误的原因都无法适应评论 :) 首先,正如FlorentBayle所解释的那样,它根本不起作用。此外,它没有(尝试)回答问题(为什么OP的代码不起作用)。它使用像List<Object>这样的东西是毫无意义和误导性的,也是一种不好的做法。如果它确实起作用,那将是非常糟糕的(N ^ 2)实现。它没有任何尝试解释作者为什么认为需要以这种内部方式完成此操作。等等。 - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接