集合的并发修改异常问题
当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
1.迭代器遍历集合且直接用集合删除元素的时候可能出现。 出现问题是因为删除第一个元素的时候,元素会自动向前补位,会漏删 用迭代器去删除,内部会自动–
ArrayList<String> list = new ArrayList<>(); list.add("西瓜"); list.add("Java"); list.add("Java"); list.add("冬瓜"); list.add("南瓜"); System.out.println(list); // [西瓜, Java, Java, 冬瓜, 南瓜] // // 需求:删除全部的Java信息。 // a、迭代器遍历删除 Iterator<String> it = list.iterator(); while (it.hasNext()){ String ele = it.next(); if("Java".equals(ele)){ // 删除Java // list.remove(ele); // 集合删除会出毛病 it.remove(); // 删除迭代器所在位置的元素值(没毛病) } } System.out.println(list);
2.foreach遍历删除 (会出现问题,这种无法解决的,foreach不能边遍历边删除,会出bug)
for (String s : list) { if("Java".equals(s)){ list.remove(s); } }
3.lambda表达式(会出现问题,这种无法解决的,Lambda遍历不能边遍历边删除,会出bug)
list.forEach(s -> { if("Java".equals(s)){ list.remove(s); } });
4.for循环删除并不会报错,但是会出现漏删
解决方案1: 边遍历边删除集合没毛病,但是必须从后面开始遍历删除才不会出现漏掉应该删除的元素
for (int i = list.size() - 1; i >= 0 ; i--) { String ele = list.get(i); if("Java".equals(ele)){ list.remove(ele); } } System.out.println(list); }
解决方案2: 和迭代器一样进行–
for (int i = 0; i <list.size() ; i++) { String ele = list.get(i); if("Java".equals(ele)){ list.remove(ele); i--; } } System.out.println(list); }
下一篇:
【Java游戏项目】1小时做出坦克大战