迭代器是做什么的?迭代器的fail-fast机制了解吗?主要为了解决什么问题?
集合的for循环。快速失败机制。集合在迭代时,其他线程有修改操作,会抛并发修改异常。
从定义上看,迭代器是为容器而生,它本质上就是一种遍历的算法。因为容器的实现千差万别,很多时候不可能知道如何去遍历一个集合对象的元素。Java为我们提供了使用迭代的接口,Java的所有集合类丢失进行迭代的。
在迭代器Iteartor接口中,有以下3个方法:
1.hasNext() 该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false
2.next() 把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用
3.remove() 从迭代器指向的Collection中移除迭代器返回的最后一个元素,该操作使用的比较少。
注意:从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。
- public class Test3 {
- public static void main(String[] args) {
- List<String>list=new ArrayList<>();
- list.add("a");
- list.add("b");
- Iterator<String>it=list.iterator();//得到lits的迭代器
- //调用迭代器的hasNext方法,判断是否有下一个元素
- while (it.hasNext()) {
- //将迭代器的下标移动一位,并得到当前位置的元素值
- System.out.println(it.next());
- }
- }
- }
fail-fast 机制是java集合(Collection)中的一种错误机制。
当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
接下来,我们再系统的梳理一下fail-fast是怎么产生的。步骤如下:
(01) 新建了一个ArrayList,名称为arrayList。
(02) 向arrayList中添加内容。
(03) 新建一个“线程a”,并在“线程a”中通过Iterator反复的读取arrayList的值。
(04) 新建一个“线程b”,在“线程b”中删除arrayList中的一个“节点A”。
(05) 这时,就会产生有趣的事件了。
在某一时刻,“线程a”创建了arrayList的Iterator。此时“节点A”仍然存在于arrayList中,创建arrayList时,expectedModCount = modCount(假设它们此时的值为N)。
在“线程a”在遍历arrayList过程中的某一时刻,“线程b”执行了,并且“线程b”删除了arrayList中的“节点A”。“线程b”执行remove()进行删除操作时,在remove()中执行了“modCount++”,此时modCount变成了N+1!
“线程a”接着遍历,当它执行到next()函数时,调用checkForComodification()比较“expectedModCount”和“modCount”的大小;而“expectedModCount=N”,“modCount=N+1”,这样,便抛出ConcurrentModificationException异常,产生fail-fast事件。

被折叠的 条评论
为什么被折叠?



