java集合如list在删除时使用foreach会出现ConcurrentModificationException
使用迭代器不会,其实两者都用了迭代器
每次next方法的时候会调用
final void checkForComodification() {
if (expectedModCount != ArrayList.this.modCount)
throw new ConcurrentModificationException();
}
这个方法的modCount,是list的的修改次数,expectedModCount这个是内部类iterator的修改次数,iterator的remove会同时修改这两个参数所以不会不相等,因此不报错。
主要原因是,list
List<Ghost> list=new ArrayList<>();
list.add(new Ghost("xiaoming"));
list.add(new Ghost("xiaohong"));
list.add(new Ghost("xiaowang"));
list.add(new Ghost("zz"));
for (Ghost ghost : list) {
if(ghost.getName().equals("xiaohong")||ghost.getName().equals("xiaowang")){
list.remove(ghost);
}
}
上面错误示例
如下为可用示例
List<Ghost> list=new ArrayList<>();
list.add(new Ghost("xiaoming"));
list.add(new Ghost("xiaohong"));
list.add(new Ghost("xiaowang"));
list.add(new Ghost("zz"));
Iterator<Ghost> iterator=list.iterator();
while(iterator.hasNext()){
Ghost ghost=iterator.next();
if(ghost.getName().equals("xiaohong")||ghost.getName().equals("xiaowang")){
iterator.remove();
}
}
@AllArgsConstructor
@Data
public class Ghost {
private String name;
}