集合的并发修改异常

集合的并发修改异常
.使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。
·由于增强 for 循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强 for 循环遍历集合,又在同时删除集合中的数据时,程序也会出现并发修改异常的错误


怎么保证遍历集合同时删除数据时不出 bug ?
.使用选代器遍历集合,但用迭代器自己的删除方法删除数据即可。
·如果能用 for 循环遍历时:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做 i -﹣操作。

package com.xinbao.d5_collection_exception;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class CollectionTest1 {
    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add("李白");
        list.add("李商隐");
        list.add("苏轼");
        list.add("王维");
        list.add("李宇春");
        System.out.println(list);//[李白, 李商隐, 苏轼, 王维, 李宇春]

//        Iterator 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 name = list.get(i);
//            if (name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);//[李商隐, 苏轼, 王维]

//        删完之后i--
//        for (int i = 0; i < list.size(); i++) {
//            String name2 = list.get(i);
//            if (name2.contains("李")) {
//                list.remove(name2);
//                i--;
//            }
//        }
//        System.out.println(list);//[苏轼, 王维]

//        //从后往前遍历
//        for (int i = list.size() - 1; i >= 0; i--) {
//            String name = list.get(i);
//            if (name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);//[苏轼, 王维]

        Iterator it = list.iterator();
        while (it.hasNext()){
            String name = it.next();
            if (name.contains("李")){
                //list。remove(name);//并发修改异常的错误
                it.remove();//删除迭代器当前遍历到的数据,每删除一个数据后,相当于也在底层做了i--
            }
        }
        System.out.println(list);//[苏轼, 王维]

//        //增强for循环遍历集合并删除,无法解决并发删除错误
//        for (String name : list) {
//            if (name.contains("李")){
//                list.remove(name);//报错
//            }
//        }
//        System.out.println(list);

//        //Lambda遍历删除,无法避免并发删错错误
//        list.forEach(name -> {
//            if (name.contains("李")){
//                list.remove(name);//报错
//            }
//        });
//        System.out.println(list);

    }
}

你可能感兴趣的:(数据结构,算法)