2013-03-14 104 views
1

我对Java仍然很陌生,今天我尝试了解使用迭代器。
所以,我有几个问题:Iterable和Iterator接口的使用

  1. 为什么我需要实现Iterable的话,那只是给创建集合的新的迭代的方法,但我也可以同样使用正常,或者如果我想获得所有元素,则加强for-loop。 我已经读过这个问题:What is the Iterable interface used for?以及更多,但他们只是说它可以让你遍历所有的元素,这导致我的问题。

  2. 如果我实现Iterable,我应该执行迭代器吗?
    因为这实际上提供了可能对覆盖有用的方法。
    例如,如果我班有一个布尔值,我是否要我在一个循环或没有对象,我可以写

    public boolean hasNext() { 
    if(loop) 
        return true; 
        //other things 
    } 
    
  3. 如果我在第2样说,将一个enchanced for循环使用这些覆盖方法?
    例如上面提到的循环属性:如果for循环是真的,for循环会无限运行吗?

我希望有人能帮助我更好地理解这个整体概念。

+1

如果*不*实现Iterable,您将如何在您的课堂上使用for-each? – 2013-03-14 18:39:24

+0

重复http://stackoverflow.com/questions/89891/what-are-the-benefits-of-the-iterator-interface-in-java – 2013-03-14 18:41:59

+0

对于未来的问题,请在每次只问一个问题。 SO问题之间的链接很好,但是一个SO问题应该只包含一个问题。想象一下,如果某人只回答第一个问题和第二个问题会发生什么情况,但是如果您接受答案,第三个问题将会打开 - 未来的访问者可能不会看到第三个问题仍然是开放的,如果您不接受它,它看起来像前两个子问题的答案是不正确的或不满意的。 – 2013-03-14 18:45:45

回答

4

如果你正在定义一个集合,你的实现一个Iterable。例如,如果你想创建一个自定义列表,您通常会让它继承AbstractList,这本身延伸AbstractCollection,它实现Collection,它实现Iterable。所以你的名单将是“事实上”Iterable

但如果你继承AbstractList,你不会自己实现迭代器,因为这种方法将已经在那里执行。也就是说,你可能想为你的需求提供一个专门的迭代器。

当你实现Iterable(如果你真的想),你返回Iterator。集合本身不应该实现Iterator,只有返回的迭代器。看看AbstractList的源代码,看看它是如何完成的。

当您使用增强的for循环,您使用的是Iterable。增强型for循环只是语法糖,用于迭代器上的循环,由iterator()返回。这意味着编译器会将您的代码转换为使用迭代器。这就是为什么您必须实施Iterable才能将该集合用于增强型for-loop。