java集合框架通过iterator接口实现统一遍历,核心是解耦遍历逻辑与集合实现;所有集合类实现iterable接口并返回iterator,使用者仅需hasnext()和next()即可遍历任意集合,for-each本质也是iterator,且it.remove()保证遍历中安全删除。

Java 集合框架通过 Iterator 接口 实现统一访问方式,核心在于“解耦遍历逻辑与集合实现”。它不关心底层是数组(ArrayList)、链表(LinkedList),还是哈希表(HashSet),只要集合实现了 Iterable 接口,就能用完全相同的代码遍历。
统一靠接口契约,不是靠具体实现
所有集合类(List、Set、Queue 等)都实现了 Iterable<e></e> 接口,该接口只定义一个方法:
-
Iterator<e> iterator()</e>—— 返回一个能遍历当前集合的迭代器实例
这个返回值类型始终是 Iterator<e></e>,不管内部怎么存数据。使用者只需调用 hasNext() 和 next(),无需知道它是查数组下标、跳指针,还是算哈希桶位置。
遍历代码完全一致,换集合不用改逻辑
下面这段代码适用于 ArrayList、LinkedList、HashSet、TreeSet 甚至 ArrayDeque:
Iterator<string> it = collection.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}</string>
- 对
ArrayList:迭代器内部维护一个整数索引 - 对
LinkedList:迭代器内部持有一个节点引用,逐个 nextNode - 对
HashSet:迭代器实际遍历的是底层HashMap的桶数组 + 链表/红黑树
但上层代码完全不用感知这些差异——这就是统一性的本质。
for-each 循环背后也是 Iterator
你写的这行代码:
for (String s : list) { ... }
编译后等价于手动调用 iterator() + hasNext() + next()。JVM 和编译器自动帮你做了封装,进一步隐藏了实现细节,强化了“统一”体验。
remove() 方法也保持行为一致
在遍历中删除元素时,直接调用集合的 remove()(如 list.remove(obj))容易触发 ConcurrentModificationException。而迭代器的 remove() 是唯一被允许的“边遍历边删”方式:
- 每个集合的迭代器自己负责同步修改计数(
modCount检查) - 调用
it.remove()时,它知道怎么安全更新自身状态和集合结构 - 无论删的是数组中的元素,还是链表节点,或哈希表里的 Entry,对外 API 完全一样
这种一致性让开发者可以写可复用的通用工具方法,比如一个打印并过滤空字符串的函数,传入任意 Collection<string></string> 都能正常工作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











