java - Iterable 和 Iterator 接口(interface)的使用

标签 java iterator iterable

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

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

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

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

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

最佳答案

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

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

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

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

关于java - Iterable 和 Iterator 接口(interface)的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15417472/

相关文章:

java - 设置 OSGi 包的权限

java - 寻找竞争条件

python - 如何在不递增的情况下获取迭代器当前指向的项目?

python - pandas 面板 'iterrows'(遍历长轴)

java - 包含 Iterable 和 Iterator 的方法?

python - 将映射 lambda 转换为列表理解

Python:如何断言可迭代的第一个元素的类型?

java - 使用 16 位像素数据在 Java 中创建图像

java - 将 v1 插入 @Path 注解 (java 1.6)

mysql - Corba 迭代器从 MySQL 批量检索数据