快速失败:在java.util包下的集合类都是快速失败的,具体说就是在我们采用迭代器遍历集合元素时, 这时又在对集合加入数据,这是就会抛出ConcurrentModificationException异常。
代码演示
Map<String,Integer> map = new HashMap<>();
map.put("张三",18);
map.put("李四",20);
map.put("王五",19);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
//往集合中添加数据
map.put("小明",18);
System.out.println("姓名:"+next.getKey()+" "+"年纪:"+next.getValue());
}
运行结果
原因:在遍历集合的数据过程中,或有一个变量modCount指向下一个位置的的数据。在java.util包下的集合中,如果在遍历数据时,添加了新的元素在集合中,那么此时的modCount的值就会发生变化,在下一次遍历时,发现并不是所期待的数据位置,就会抛出ConcurrentModificationException异常
安全失败:在java.util.Concurrent包下的集合类都是安全失败,具体说就是在我们采用迭代器遍历集合元素时这是集合中加入数据不会抛出异常,正常执行。
代码演示
Map<String,Integer> map = new ConcurrentHashMap<>();
map.put("张三",18);
map.put("李四",20);
map.put("王五",19);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
//往集合中添加数据
//map.put("小明",18);
System.out.println("姓名:"+next.getKey()+" "+"年纪:"+next.getValue());
}
运行结果
原因:在遍历集合的数据过程中,也有一个变量modCount指向下一个位置的,java.util.Concurrent包下的集合类,在遍历集合中的数据时,会把集合中的数据复制下来,然后遍历复制的数据,此时不管是否往集合中添加数据都不会影响最后的结果。