Iterator和Iterable的 新理解--一个神奇的接口

来源:互联网 发布:d3.js的作用 编辑:程序博客网 时间:2024/05/18 02:58
Iterator 和 Iterable

1.两者区别
1)Iterator只是使用一次,Iterable可以使用多次,Iterable负责产生Iterator,用完就可以仍了
2)什么时候应该封装哪个?如果获得的流那么使用Iterator包装  如果获得的是 文件则包装为Iterable

2.神奇之处:
   1.iterator 可以把逻辑访问从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构  。

Iterator 的遍历方式:

for(Iterator<String> iter = list.iterator();iter.hasNext;){
    String tempStr = iter.next();
}
客户端从不直接和集合类打交道,他总是控制Iterator ,向它发送向前,向后,取当前元素的命令就可以间接地遍历整个集合


3.java.util.Iterator的实现


方法摘要 booleanhasNext()
          如果仍有元素可以迭代,则返回 true Enext()
          返回迭代的下一个元素。 voidremove()
          从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

     每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。
     在JDK5.0之后还可以使用foreach来对数组或者实现了Iterator的类对象进行遍历,但是只是限于遍历操作,不能删除,删除还是要用Iterator进行删除

4.在JDK中不论是List 还是Set都是实现的Iterable接口  为什么呢? 为什么不直接实现Iterator接口呢?
   
   在Iterator中的核心方法是next() hasNext(),是依赖于迭代器的当前位置的 ,如果Collection都是实现的Iterator接口,势必导致集合对象中包含当前迭代器位置的数据,
当集合作为参数在不同方法中进行传递的时候,next()的位置是不可预知的
   
   而Iterator则不然,每次调用都返回一个 从头开始的计数器,多个迭代器是相互不干扰的。
0 0
原创粉丝点击