黑马程序员技术交流社区

标题: 关于Iterator的问题 [打印本页]

作者: huangkj    时间: 2014-11-24 23:21
标题: 关于Iterator的问题
Iterator不是接口么,里面的方法肯定也都是抽象方法,为啥还能用hasNest(); 和next(); 来遍历集合呢?
作者: 杨佳名    时间: 2014-11-25 00:12
本帖最后由 杨佳名 于 2014-11-25 00:17 编辑

Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一样。所以Iterator只定义成一个接口。拿ArrayList的Iterator举例,查看源码:
  1. public interface Iterator
  2.         {
  3.                 public abstract boolean hasNext();
  4.                 public abstract Object next();
  5.         }

  6.         public interface Collection
  7.         {
  8.                 public abstract Iterator iterator();
  9.         }
  10.        
  11.         public interface List extends Collection
  12.         {
  13.                 ...
  14.         }
  15.        
  16.         public class ArrayList implements List
  17.         {
  18.                 public Iterator iterator() {
  19.                         return new Itr();
  20.                 }

  21.                 private class Itr implements Iterator {
  22.                         public boolean hasNext() {
  23.                                 return xxx;
  24.                         }

  25.                         public E next() {
  26.                                 return xxx;
  27.                         }
  28.                 }
  29.         }
复制代码



其中...和xxx省略了代码中具体内容,不影响阅读就好。
可以看出,Iterator it = c.iterator();   是把Itr对象返回来了,而Itr已经实现了Iterator接口,这里是多态的表现。也表明了,虽然每种集合的数据结构不同,但都根据自己的特点,底层实现了Iterator,所以集合都可以用Iterator来进行遍历。





作者: yninggis    时间: 2014-11-25 00:29
看我这样理解对不对:这是一个多太的体现。Iterator是接口,但是每个元素里面都实现了Iterator。调用iterator()方法(hasNest(); 和next(); )来获取Iterator接口的子类对象,利用接口的子类对象来调用接口中的方法当然可以了。以上是我的个人理解,谢谢!
作者: zhangyangLengen    时间: 2014-11-25 16:17
其实Iterator接口在ArrayList集合中是以内部类的形式进行体现的。外部类提供一个访问内部类对象的公共的方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2