遍历集合时remove或add操作注意事项

不可以在 foreach 循环里进行元素的 remove/add 操作,remove 元素需要使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。foreach 语法底层其实还是依赖 Iterator ,不过, remove/add 操作直接调用的是集合自己的方法,而不是 Iterator 的 remove/add方法。这就导致 Iterator 莫名其妙地发现自己有元素被 remove/add ,然后,它就会抛出一个 ConcurrentModificationException 来提示用户发生了并发修改异常。

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

public class IteratorRemoveExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);

        // 使用迭代器遍历集合并尝试在遍历过程中调用 remove() 方法
        Iterator<Integer> iterator = numbers.iterator();
        while (iterator.hasNext()) {
            Integer number = iterator.next();
            if (number == 2) {
                // 尝试在迭代器遍历过程中调用 remove() 方法
                // 这行代码会导致 ConcurrentModificationException 异常
                numbers.remove(number);
            }
        }
    }
}

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at JavaKnowledge.IteratorTest.IteratorRemoveExample.main(IteratorRemoveExample.java:21)

正确地remove/add:


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

public class IteratorRemoveExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        Iterator<Integer> iterator = numbers.iterator();
        // 使用迭代器遍历集合并正确删除元素
        while (iterator.hasNext()) {
            Integer number = iterator.next();
            if (number == 2) {
                iterator.remove(); // 使用 remove() 方法来删除当前迭代到的元素
            }
        }
        System.out.println(numbers); // 输出结果为 [1, 3, 4]
    }
}

[1, 3, 4]

参考B站UP主:不吃辣Chris

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值