首页 > 图灵资讯 > java面试题>正文
java基础面试题-List遍历快速和安全失败
2024-05-15 13:52:31
①普通for循环遍历List删除指定元素
for(int i=0; i < list.size(); i++){ if(list.get(i) == 5) list.remove(i);}
② 迭代遍历,用list.remove(i)方法删除元素
Iterator<Integer> it = list.iterator();while(it.hasNext()){ Integer value = it.next(); if(value == 5){ list.remove(value); }}
③foreach遍历List删除元素
for(Integer i:list){ if(i==3) list.remove(i);}
fail—fast:快速失败
当异常产生时,直接抛出异常,程序终止。
fail-fast主要是体现在当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构(modCount)被改变的话,就会抛出异常ConcurrentModificationException,防止继续遍历。这就是所谓的快速失败机制。
fail—safe:安全失败
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。由于在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException。
缺点:基于拷贝内容的优点是避免了ConcurrentModificationException,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。