一、先看结论:
特性/对比项 | Iterable |
Iterator |
---|---|---|
接口定义位置 | java.lang.Iterable |
java.util.Iterator |
作用 | 表示一个可以被迭代的集合对象 | 实际进行遍历的迭代器对象 |
核心方法 | Iterator<T> iterator() |
boolean hasNext() 、T next() 、void remove() (可选) |
是否用于 for-each | ✔ 支持(是 for-each 的基础) | ✖ 不直接支持 for-each |
举例 | List 、Set 等集合类实现了它 |
ArrayList.Iterator 是它的实现 |
关系 | 是一个集合类型的契约 | 是一个具体遍历行为的实现 |
二、概念解析
1. Iterable<T>
接口
csharp
public interface Iterable<T> {
Iterator<T> iterator();
}
-
目的:表示这个对象是"可被遍历"的。
-
方法含义:
iterator()
:返回一个Iterator
对象,用来实际进行遍历操作。
-
常见实现类:
ArrayList
、HashSet
、LinkedList
等集合类都实现了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()
方法进行元素访问。