Iterator
的 remove/add
方法
这就导致 Iterator
莫名其妙地发现自己有元素被 remove/add
,然后,它就会抛出一个 ConcurrentModificationException
来提示用户发生了并发修改异常 。这就是单线程状态下产生的 fail-fast 机制 。
fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时候 , 可能会抛出Java8 开始,可以使用ConcurrentModificationException
。即使是单线程下也有可能会出现这种情况,上面已经提到过 。
Collection#removeIf()
方法删除满足特定条件的元素 , 如List<Integer> list = new ArrayList<>();for (int i = 1; i <= 10; ++i) {list.add(i);}list.removeIf(filter -> filter % 2 == 0); /* 删除list中的所有偶数 */System.out.println(list); /* [1,3, 5 , 7,9] */
除了上面介绍的直接使用 Iterator
进行遍历操作之外,你还可以:- 使用普通的 for 循环
- 使用 fail-safe 的集合类 。
java.util
包下面的所有的集合类都是 fail-fast 的 , 而java.util.concurrent
包下面的所有的类都是 fail-safe 的 。
可以利用这里我们以Set
元素唯一的特性,可以快速对一个集合进行去重操作 , 避免使用List
的contains()
进行遍历去重或者判断包含操作 。
HashSet
和 ArrayList
为例说明 。
推荐阅读
- Java单例模式,看这一篇就够了
- 微信支付v3接口的 官方 Java SDK
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
- 夯实Java基础,一篇文章全解析线程问题
- 四 Java多线程-ThreadPool线程池-2
- 生成器函数 javascript异步编程之generator与asnyc/await语法糖
- Java Timer使用介绍
- 三 Java多线程-ThreadPool线程池
- 二 Java多线程-线程关键字
- 二 Java 编码那些事