彻底搞懂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() 方法进行元素访问。

相关推荐
纪莫15 小时前
技术面:Java并发(线程池、ForkJoinPool)
java·java面试⑧股
叫我阿柒啊15 小时前
从Java全栈到前端框架:一次真实的面试对话
java·spring boot·微服务·前端框架·vue3·全栈开发
齐 飞16 小时前
SpringBoot实现国际化(多语言)配置
java·spring boot·后端
萤丰信息16 小时前
智慧工地如何撕掉“高危低效”标签?三大社会效益重构建筑业价值坐标
java·大数据·人工智能·微服务·重构·架构·智慧工地
fqq316 小时前
记录一个细节问题Servlet注解有两种方式
java·servlet·tomcat
小薛博客17 小时前
26、Jenkins流水线
java·servlet·jenkins
CHEN5_0217 小时前
【CouponHub项目开发】EasyExcel解析Excel并使用线程池异步执行和延时队列兜底
java·数据库·excel
Metaphor69217 小时前
Java 如何在 Excel 中添加超链接?使用 Spire.XLS for Java 轻松实现
java·经验分享·excel
David爱编程17 小时前
锁升级机制全解析:偏向锁、轻量级锁、重量级锁的秘密
java·后端
技术小泽17 小时前
深度解析Netty架构工作原理
java·后端·性能优化·架构·系统架构