A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 永恒之翼网络 中级黑马   /  2012-4-28 23:16  /  6008 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Iterable和iterator有什么区别?Iterator接口Iterable接口都是是迭代器,为什么还要Iterable接口呢?

4 个回复

倒序浏览
Collection集合的接口就是继承了Iterable接口。iterator对collection 进行迭代的迭代器。
回复 使用道具 举报
java.lang.Iterable
java.util.Iterator
Iterator是迭代器类,而Iterable是接口。
好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。
一般都是结合着用,比如
HashMap类就实现了Iterable接口,而要访问或打印出Map中所有内容时,就可以这样: HashMap hashMap;
Iterator iter = hashMap.iterator();
while(iter.hashNext()) {
  String s = iter.next();
}
为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?
      看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。

      因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
      如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
      当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
      除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
      但即时这样,Collection也只能同时存在一个当前迭代位置。
      而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
      多个迭代器是互不干扰的。
回复 使用道具 举报
Iterable是JDK1.5的新特性,而Iterator在JDK1.2时就出现了, Iterable有很多实现类,常用的 例如 List结合,Set集合等,当对集合中的对象进行迭代的时候就不用去实现Iterable借口了,因为集合已经在内部对其进行了实现,而在JDK1.5以前,必须先得实现Iterator接口,然后再去调用其中的方法,现在就不用了,sun公司已经为我们提供了很好的实现,并且调用Iterable中的iterator方法时返回的是Iterator实现类的的对象,所以就可以直接可以调用Iterator中的 hasNext(),next().以及remove()方法了。
这使得我们的开发得到了简化。
回复 使用道具 举报
首先看下层次关系图:
Iterable
    ^
    |
Collection->Iterator
也就是说Iterable是最顶层,而Iterator是底层实现 .
其次如果类要实现前者,则允许该类的对象成为增强for语句的目标;
而Iterator的特点是在迭代集合元素之前,必须获得一个迭代器对象.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马