彻底搞懂Iterable 和 Iterator

一、先看结论:

特性/对比项 Iterable Iterator
接口定义位置 java.lang.Iterable java.util.Iterator
作用 表示一个可以被迭代的集合对象 实际进行遍历的迭代器对象
核心方法 Iterator<T> iterator() boolean hasNext()T next()void remove()(可选)
是否用于 for-each ✔ 支持(是 for-each 的基础) ✖ 不直接支持 for-each
举例 ListSet 等集合类实现了它 ArrayList.Iterator 是它的实现
关系 是一个集合类型的契约 是一个具体遍历行为的实现

二、概念解析

1. Iterable<T> 接口

csharp 复制代码
public interface Iterable<T> {
    Iterator<T> iterator();
}
  • 目的:表示这个对象是"可被遍历"的。

  • 方法含义

    • iterator():返回一个 Iterator 对象,用来实际进行遍历操作。
  • 常见实现类

    • ArrayListHashSetLinkedList 等集合类都实现了 Iterable 接口。

2. Iterator<T> 接口

csharp 复制代码
public interface Iterator<T> {
    boolean hasNext();   // 判断是否还有下一个元素
    T next();            // 返回下一个元素
    void remove();       // 删除当前元素(可选)
}
  • 目的:用于实际执行"遍历操作"的对象。
  • 用法 :通过 hasNext() 判断是否还有元素,通过 next() 取出元素。
  • 通常通过 Iterable.iterator() 获取实例

三、形象比喻

  • Iterable 就像一本书,它能被翻页
  • Iterator 就是一个人,他负责一页一页地翻
  • 一本书(Iterable)有方法 iterator() 来"召唤"这个翻页的人(Iterator);

四、代码示例详解

示例 1:最基础的使用方式

java 复制代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
​
public class IterableIteratorDemo {
​
    public static void main(String[] args) {
​
        // 创建一个 List,List 实现了 Iterable 接口
        List<String> names = new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("王五");
​
        // 方式一:使用 for-each 语法遍历(本质依赖于 Iterable)
        for (String name : names) {
            System.out.println("for-each 遍历: " + name);
        }
​
        // 方式二:显式使用 Iterator 遍历
        Iterator<String> iterator = names.iterator(); // 获取迭代器对象
​
        while (iterator.hasNext()) { // 判断是否还有元素
            String name = iterator.next(); // 获取下一个元素
            System.out.println("Iterator 遍历: " + name);
        }
    }
}

输出:

vbnet 复制代码
for-each 遍历: 张三
for-each 遍历: 李四
for-each 遍历: 王五
Iterator 遍历: 张三
Iterator 遍历: 李四
Iterator 遍历: 王五

示例 2:自定义类实现 Iterable 接口

java 复制代码
import java.util.Iterator;
import java.util.NoSuchElementException;
​
// 自定义一个实现 Iterable 接口的类,表示 0 到 n 的整数序列
public class MyRange implements Iterable<Integer> {
​
    private int max;
​
    public MyRange(int max) {
        this.max = max;
    }
​
    // 实现 iterator() 方法,返回自定义的 Iterator
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            private int current = 0; // 当前遍历到的位置
​
            @Override
            public boolean hasNext() {
                return current <= max; // 如果没到 max,则还有下一个
            }
​
            @Override
            public Integer next() {
                if (!hasNext()) {
                    throw new NoSuchElementException();
                }
                return current++; // 返回当前值,并自增
            }
        };
    }
​
    // 主方法进行测试
    public static void main(String[] args) {
        MyRange range = new MyRange(5);
​
        for (int i : range) { // 支持 for-each 语法
            System.out.print(i + " "); // 输出 0 1 2 3 4 5
        }
    }
}

五、总结

类别 说明
Iterable 一个集合类如果实现了它,就可以使用 for-each 遍历。是一个 "集合的能力"
Iterator 是对集合进行遍历的 "工具" ,包含有 hasNext()next() 等实际操作。
常见关系 所有实现了 Iterable 的类(如 List、Set)都可以通过 iterator() 获取 Iterator 对象

六、思维点

"for-each 背后发生了什么?"
for-each 背后的实现依赖于 Iterable 接口,它会调用集合的 iterator() 方法返回一个 Iterator 对象,然后循环调用 hasNext()next() 方法进行元素访问。

相关推荐
Fency咖啡3 小时前
Spring Boot 3.x 开发 Starter 快速上手体验,通过实践理解自动装配原理
java·spring boot·后端
悟能不能悟3 小时前
什么是反应式编程
java
南方者4 小时前
【JAVA】【BUG】Java 开发中常见问题的具体示例,结合代码片段说明问题场景及原因
java·后端·debug
没有bug.的程序员4 小时前
MySQL 配置调优参数:从基础到生产级优化指南
java·数据库·mysql·优化·mysql配置调优
画船听雨眠aa4 小时前
Java8新特性——Stream API常见操作
java
crystal_pin4 小时前
indexDB
面试
Java水解4 小时前
100道互联网大厂面试题+答案
java·后端·面试
nlog3n4 小时前
分布式计数器系统完整解决方案
java·分布式
ytadpole4 小时前
Java并发编程:从源码分析ThreadPoolExecutor 的三大核心机制
java·面试
Aevget4 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(一)
java·ide·java-ee·myeclipse