在 foreach的同时修改集合,会触发fail-fast机制,这是因为List的foreach遍历内部使用了迭代器(Iterator),而迭代器设计中包含了一种称为fail-fast机制的错误检测机制。要避免fail-fast机制,有如下处理方案:
1. 通过普通的for循环(可能会造成漏删)
主要是因为List的索引在元素被移除时会发生变化,从List中移除一个元素时,该元素之后的所有元素都会向前移动一位,也就是它们的索引会减少1。因此,当i递增到下一个值时,它将跳过紧接在被删除元素之后的那个元素。
2. 通过普通的for循环倒序遍历
此方法可以避免漏删
3. 使用.hasNext()和.next()循环
4. 使用并发安全的集合类
在此之前需要转为线程安全的集合
5. 使用Stream的过滤方法
Stream每次处理过后都会生成一个新的Stream,不存在并发问题,所以Stream的filter也可以修改list集合
6. 使用removeIf方法