集合的并发修改异常
使用迭代器遍历集合时, 有同事再删除集合中的数据, 程序就会出现并发修改异常的错误.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class yichang {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("王麻子");
list.add("小李子");
list.add("李狗蛋");
list.add("张全蛋");
list.add("小李");
list.add("李玉刚");
list.add("西伯利亚毒虫");
System.out.println(list);
//[王麻子, 小李子, 李狗蛋, 张全蛋, 小李, 李玉刚, 西伯利亚毒虫]
//需求: 找出集合中全部带"李"的名字, 并从集合中删除
// Iterator<String> it = list.iterator();
// while (it.hasNext()){
// String name = it.next();
// if (name.contains("李")){
// list.remove(name);
// }
// System.out.println(list);
// for (int i = 0; i < list.size(); i++) {
// String s = list.get(i);
// if (s.contains("李")){
// list.remove(s);
// }
// }
// System.out.println(list);//[王麻子, 李狗蛋, 张全蛋, 李玉刚, 西伯利亚毒虫]
// //没有删完, 因为当删了小李子后后面的数据索引都小1
// //李狗蛋变成第2个元素索引为1, 但由于i++, 索引变为2,就跳过了李狗蛋, 后面的同理
//解决办法
// for (int i = 0; i < list.size(); i++) {
// String s = list.get(i);
// if (s.contains("李")){
// list.remove(s);
// i--;
// }
// }
// System.out.println(list);
// // [王麻子, 张全蛋, 西伯利亚毒虫]
Iterator<String> it = list.iterator();
while (it.hasNext()){
String name = it.next();
if (name.contains("李")){
it.remove();// 删除迭代器当前遍历到的数据, 每删除一个数据后, 相当于也在底层做了i--
}
System.out.println(list);//[王麻子, 张全蛋, 西伯利亚毒虫]
}
}
}