迭代器

来源:互联网 发布:淘宝免单微信群2017 编辑:程序博客网 时间:2024/05/29 14:48

迭代器

1、什么是迭代器?

跌代:顺序替换,一个接着一个替换。

java中的迭代器是一个对象,提供一种遍历集合的方式并不暴露集合内部细节。

迭代的目的就是为了使用,允许用户每次获得和使用集合中的一个元素。

迭代器模式:

迭代器角色;具体迭代角色

容器角色 具体容器角色

集合本身就可以通过数据结构来遍历,为什么还要迭代器呢?

因为遍历的过程要用到数据结构,所以为了不暴露数据结构,数据的底层实现原理。

Iterator 迭代对象

Iterable 迭代接口 集合实现 可以用itertor()方法返回一个迭代对象。

定义和遍历元素的接口,内部类。

2、迭代器有什么用?

将遍历序列的操作与序列底层的结构分离,解耦合。

单一职责:集合的职责有两个:存储数据,交互数据。

将遍历聚合对象中的数据的行为提取出来,封装到迭代器中。

3、迭代器如何使用?

      for each while 两种方式 用iterator()方法获得迭代对象

4、如何实现迭代器

内部维护一个游标

  内部类 size 和modCount current 游标的方式来实现next hasNext remove方法

都会先判断 modCount,如果在使用迭代器时改变集合将产生并发修改异常。

checkForModification 迭代器检查其修改计数,以确保与创建它的集合修改一致。

这就是快速失败。失败产生异常,快速,集合改变。fair-fast

5、迭代器使用注意事项

(1)不能有两个next

(2)不能调用集合的方法会产生并发修改异常

(3)ListIterator 双向遍历 有add set()还有向前的方法

(4)forEach不能调用集合的方法,也不能通过迭代对象调用remove()

for each不能用到改变size的方法,for each本质就是调用迭代器

可以改用while和Iterator相结合的方法。

ArrayList使用size来维护集合的状态,而Iterator用current来维护。

当size发生变化时,current并不一定能过立即得到同步除非这种变化是Iterator主动导致的。

因为Iteraotr会调用集合中的增删方法,所以会改变size。

快速迭代失败会跑出并发修改异常。ConcurrenModificationExceprion

(5)不能假设迭代器访问元素的顺序,除非显示声明。

如果底层集合不是由迭代器本身主动进行修改的,fair-fast模式将快速而清晰地发生失败。

在后继的操作中,迭代器会通知集合的修改计数size,确保该值不会修改。

如果修改将抛出ConcurrentModificationException

原创粉丝点击