添加到List时抛出java.util.ConcurrentModificationException

时间:2018-04-23 00:22:11

标签: java arraylist iterator

当我运行此功能时,尽管使用了java.util.ConcurrentModificationException

,但我得到iterator.remove(); 显然,我在循环中添加了数字6。这是否会发生,因为迭代器“不知道”它在那里并且无论如何都要修复它?

public static void main(String args[]){

    List<String> list = new ArrayList<>();

    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");

    for(Iterator<String> it = list.iterator();it.hasNext();){
        String value = it.next();

        if(value.equals("4")) {
            it.remove();
            list.add("6");
        }

        System.out.println("List Value:"+value);
    }
}

2 个答案:

答案 0 :(得分:8)

调用String value = it.next();时会抛出ConcurrentModificationException。但实际的罪魁祸首是list.add("6");。在直接迭代Collection时,您不能修改it.remove();。您使用的是list.add("6");,但不是for(ListIterator<String> it = list.listIterator(); it.hasNext();){ String value = it.next(); if(value.equals("4")) { it.remove(); it.add("6"); } System.out.println("List Value:"+value); }

但您可以解决此问题,但您需要ListIterator<String>才能解决此问题。

List<String> newList = list.stream()
        .map(s -> s.equals("4") ? "6" : s)
        .collect(Collectors.toList());

这应该可以解决问题!

如果我可以提供Java 8替代方案:

Stream

我们在此处List创建map。我们"4"所有值都归于自己,只有"6"被映射到List,然后我们将其收回newList。但请注意,#include <stdio.h> int main(void) { char a[50]; int x = 1; while( x > 0){ gets(a); int i,length=0; for(i=0;a[i]!='\0';i++) length+=1; for(i=0;i<length;i++){ a[i]=a[i]^32; } printf("%s",&a); } } 是不可改变的!这也是效率较低,但更优雅(imho)。

答案 1 :(得分:0)

使用java集合类时,java.util.ConcurrentModificationException是一个非常常见的异常。 Java Collection类是快速失败的,这意味着如果在某个线程使用迭代器遍历它时将更改Collection, iterator.next()throw ConcurrentModificationException。 对于多线程以及单线程java编程环境,可能会出现并发修改异常。