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

Isp*_*hAU 1 java iterator arraylist

当我运行这个时,我得到了一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Neu*_*ron 9

ConcurrentModificationException打电话时被抛出String value = it.next();.但实际的罪魁祸首是list.add("6");.您不能修改一段Collection时间直接迭代它.你使用的it.remove();是好的,但不是list.add("6");.

但是你可以解决这个问题,但是你需ListIterator<String>要这样做.

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);
}
Run Code Online (Sandbox Code Playgroud)

这应该做的伎俩!


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

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

在这里我们创建一个Stream来自你的List.我们map都重视自己,只"4"被映射到"6"然后我们将它收集回来List.但谨慎,newList是不可改变的!这也是效率较低,但更优雅(imho).