当我运行它时,尽管我使用了 iterator.remove();
java.util.ConcurrentModificationException
显然是我在循环中添加了数字 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);
}
}
最佳答案
ConcurrentModificationException
调用 String value = it.next();
时抛出.但真正的罪魁祸首是list.add("6");
.你不能修改 Collection
同时直接迭代它。您正在使用 it.remove();
这很好,但不是 list.add("6");
.
虽然您可以使用 Stream
解决问题s,我将首先提供一个解决方案 Iterator
s,因为这是理解问题的良好开端。
你需要一个 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);
}
这应该可以解决问题!
使用 Stream
的解决方案小号:
List<String> newList = list.stream()
.map(s -> s.equals("4") ? "6" : s)
.collect(Collectors.toList());
这里我们创建一个 Stream
来自你的 List
.我们map
所有的值(value)都是自己的,只有"4"
被映射到 "6"
然后我们将它收集回 List
.但要小心,newList
是不可变的!
关于添加到列表时抛出 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971932/