6疑问

53 阅读1分钟
package com.itheima.six;

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

/*
    并发修改异常
        
        解决方案:
            使用迭代器遍历集合元素时,不能通过集合对象本身调用集合的方法,修改集合的长度
            (1)使用Collection接口迭代器的方法修改长度: remove
            (2)使用List接口特有迭代器ListIterator中的方法修改长度: remove,add

        面试题一:
            1.并发修改异常的原理是什么?
            2.为什么使用迭代器遍历Collection集合时,使用集合对象的remove方法删除倒数第二个元素,不报并发修改异常?

 */
public class Demo04IteratorException {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("AAA");
        list.add("BBB");
        list.add("CCC");
        list.add("DDD");
        //删除元素BBB
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String str = it.next();
            //判断当前元素如果是"BBB",就执行删除
            if ("BBB".equals(str)) {
                /*
                    使用迭代器遍历的过程中,又使用集合对象调用集合本身的方法,
                    修改了集合的长度(不修改长度没有任何问题)
                    报出并发修改异常
                 */
                //list.remove(str);
                /*
                    调用迭代器对象的remove方法,
                    不会报出并发修改异常
                 */
                it.remove();
            }
        }
        System.out.println(list);
    }
}