引出问题
当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
哪些遍历存在问题?
a.迭代器遍历集合且直接用集合删除元素的时候可能出现。
b.增强for循环遍历集合且直接用集合删除元素的时候可能出现。
哪种遍历且删除元素不出问题
迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。
使用for循环遍历并删除元素不会存在这个问题。
示例代码:
package collection.app.d5_collection_list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
删除集合中的元素:
当我们从集合中找出某个元素删除时,可能会出现一种并发修改异常问题
*/
public class ListDemo4 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("张三");
list.add("Java");
list.add("Java");
list.add("通通");
list.add("通通");
System.out.println(list);
//删除集合中Java元素
//1.迭代器遍历删除指定元素
// Iterator<String> it = list.iterator();
// while (it.hasNext()){
// String ele= it.next();
// if (ele.equals("Java")){
// it.remove();//使用迭代器删除当前位置,保证不后移,能够成功遍历
// }
// }
// System.out.println(list);
//2.foreach遍历删除(不可以删除,会出现异常)
// for (String s:list) {
// if ("Java".equals(s)){
// list.remove("Java");
// }
// }
// System.out.println(list);
//3.Lambda表达式(会出现异常)
// list.forEach(s->{
// if ("Java".equals(s)){
// list.remove("Java");
// }
// });
//4.for循环遍历
//a.方案1
// for (int i = 0; i < list.size(); i++) {
// if ("Java".equals(list.get(i))){
// list.remove("Java");
// i--;
// }
// }
// System.out.println(list);
//b.方案(倒着遍历删除)
for (int i=list.size()-1;i>=0;i--){
if ("Java".equals(list.get(i))){
list.remove("Java");
}
}
System.out.println(list);
}
}
运行截图: