使用Iterable和Iterator接口

时间:2013-03-14 18:35:09

标签: java iterator iterable

我还是Java新手,今天我尝试了解迭代器的使用 所以我有几个问题:

  1. 为什么我需要实现Iterable,它只提供一个方法来为集合创建一个新的迭代器,但是如果我想得到的话,我也可以使用普通的或增强的for循环所有元素。 我已经阅读了这个问题:What is the Iterable interface used for?等等,但它们只是说它允许您遍历所有元素,这可以回到我的问题。

  2. 如果我实现Iterable,我是否也应该实现Iterator? 因为这个实际上提供了可以用来覆盖的方法 例如,如果我的类有一个布尔值,我是否想要我的对象在循环中,我可以写

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

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

1 个答案:

答案 0 :(得分:4)

如果您要定义集合,则 实施Iterable。例如,如果要创建自定义列表,通常会将其设为子类AbstractList,它本身扩展AbstractCollection,实现Collection,实现Iterable。因此,您的列表将“事实上”为Iterable

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

当您实施Iterable时(如果您确实愿意),您将返回Iterator。集合本身不应该只实现返回的迭代器Iterator。查看AbstractList源代码,了解其完成方式。

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