1

我对 Java 还是很陌生,今天我尝试了解迭代器的使用。
所以我有几个问题:

  1. 为什么我需要实现 Iterable,它只提供了一种为集合创建新迭代器的方法,但如果我想获取所有元素,我也可以使用普通或增强的 for 循环。我已经读过这个问题:Iterable 接口用于什么?还有更多,但他们只是说它允许您遍历所有元素,这又回到了我的问题。

  2. 如果我实现 Iterable,我是否也应该实现 Iterator?
    因为这实际上提供了可能对覆盖有用的方法。
    例如,如果我的班级有一个布尔值,我是否希望我的对象处于循环中,我可以写

    public boolean hasNext() {
    if(loop)
        return true;
       //other things
    }
    
  3. 如果我确实像 2. 中所说的那样,增强的 for 循环会使用这些覆盖的方法吗?
    例如上面提到的循环属性:如果它是真的,for循环会无限运行吗?

我希望有人可以帮助我更好地理解整个概念。

4

1 回答 1

4

如果您正在定义一个集合,那么您正在实现一个Iterable. 例如,如果您想创建一个自定义列表,您通常会将其设为子类AbstractList,它本身扩展AbstractCollection、实现Collection、实现Iterable。因此,您的列表将是“事实上的”一个Iterable.

但是如果你子类AbstractList化,你就不必自己实现迭代器,因为这个方法已经在那里实现了。也就是说,您可能希望为您的需要提供一个专门的迭代器。

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

当您使用增强的 for 循环时,您正在使用Iterable. 增强的 for 循环只是 . 返回的迭代器上循环的语法糖iterator()。这意味着编译器将您的代码转换为使用迭代器。这就是为什么您必须实现Iterable集合以在增强的 for 循环中使用。

于 2013-03-14T18:48:38.267 回答