报错代码
@Test
void contextLoads() {
// List<String>initList = Arrays.asList("al", "bl", "cl");
ArrayList<String> initList = new ArrayList<>(Arrays.asList("al", "bl", "cl"));
initList.forEach(e->{
if(e.startsWith("b")){
initList.remove(e);
}
});
System.out.println(initList);
}
解决方案1:使用流
@Test
void contextLoads1() {
// List<String>initList = Arrays.asList("al", "bl", "cl");
List<String> initList = new ArrayList<>(Arrays.asList("al", "bl", "cl"));
// List<String> newList = initList.stream().filter(e -> !e.startsWith("b")).collect(Collectors.toList());
initList = initList.stream().filter(e -> !e.startsWith("b")).collect(Collectors.toList());
System.out.println(initList);
}
解决方案2:使用api
@Test
void contextLoads2() {
// List<String>initList = Arrays.asList("al", "bl", "cl");
List<String> initList = new ArrayList<>(Arrays.asList("al", "bl", "cl"));
initList.removeIf(e->e.startsWith("b"));
System.out.println(initList);
}
报错原因:foreach()底层是通过迭代器遍历,调用list的remove方法会修改modCount值,导致与外层的值不一致,导致报错;
相关链接
(136条消息) ConcurrentModificationException(并发修改异常)原因分析_大码青年的博客-CSDN博客
(136条消息) ConcurrentModificationException的解决方法_VBallack13的博客-CSDN博客
(135条消息)java.util.ConcurrentModificationException 异常原因和解决方法_y4ung的博客-CSDN博客
(135条消息) 探讨UnsupportedOperationException的原因及解决方案_冷血有情556的博客-CSDN博客_unsupportedoperationexception