iterator()
方法获取迭代器对象,配合hasNext()
检查元素存在性,next()
获取当前元素,支持remove()
删除元素,实现安全遍历。在Java中,迭代器(Iterator
)是一种设计模式,用于顺序访问集合对象中的元素,无需暴露其底层实现,它提供了一种标准化的遍历方式,尤其适用于List
、Set
等集合类型,以下是详细使用指南:
迭代器的核心方法
迭代器通过java.util.Iterator
接口实现,关键方法:
boolean hasNext()
检查集合中是否还有下一个元素。E next()
返回当前元素并移动指针到下一位置。void remove()
(可选)
删除上一次next()
返回的元素(需先调用next()
)。
基础使用步骤
获取迭代器对象
通过集合的iterator()
方法获取:
List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++"); Iterator<String> iterator = list.iterator(); // 获取迭代器
遍历集合
使用while
循环配合hasNext()
和next()
:
while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); } // 输出:Java → Python → C++
删除元素
在遍历中安全删除元素(避免ConcurrentModificationException
):
while (iterator.hasNext()) { String element = iterator.next(); if ("Python".equals(element)) { iterator.remove(); // 删除当前元素 } } // 结果:list变为 ["Java", "C++"]
迭代器的高级用法
增强for循环(底层基于迭代器)
语法更简洁(但无法删除元素):
for (String language : list) { System.out.println(language); }
使用forEachRemaining()
(Java 8+)
配合Lambda表达式批量处理剩余元素:
Iterator<String> it = list.iterator(); it.next(); // 跳过第一个元素 it.forEachRemaining(element -> System.out.println("剩余:" + element));
处理多类型集合
迭代器支持泛型,确保类型安全:
Set<Integer> numbers = new HashSet<>(Arrays.asList(10, 20, 30)); Iterator<Integer> numIterator = numbers.iterator(); while (numIterator.hasNext()) { Integer num = numIterator.next(); // 无需强制类型转换 }
注意事项与常见错误
-
并发修改异常
遍历时直接调用集合的add()
/remove()
会触发ConcurrentModificationException
。
✅ 正确做法:只通过迭代器的remove()
删除元素。 -
不可逆操作
迭代器是单向的,无法回退(如需双向遍历,使用ListIterator
)。 -
NoSuchElementException
调用next()
前必须用hasNext()
检查,否则可能越界。 -
迭代器复用问题
一个迭代器用完后需重新获取,否则hasNext()
始终返回false
。
迭代器的应用场景
- 遍历未知内部结构的集合(如第三方库返回的集合)。
- 需要安全删除元素的场景。
- 统一处理多种集合类型(如同时操作
List
和Set
)。
迭代器 vs. for循环
场景 | 迭代器 | 普通for循环 |
---|---|---|
删除元素 | ✅ 安全 | ❌ 需维护索引易出错 |
链表遍历性能 | ✅ 高效(O(n)) | ❌ 低效(O(n²)) |
需要索引时 | ❌ 不适用 | ✅ 直接访问索引 |
多集合统一处理 | ✅ 代码复用 | ❌ 需重复逻辑 |
迭代器是Java集合框架的基石,它通过统一的接口解耦了遍历逻辑与数据结构,关键实践:
- 用
iterator()
获取迭代器对象。 - 循环中组合使用
hasNext()
和next()
。 - 删除元素时必须通过迭代器的
remove()
方法。 - 优先使用增强for循环简化代码(无需删除元素时)。
引用说明基于Oracle官方Java文档(Java SE 17)[1]及《Effective Java》[2]中关于集合处理的最佳实践,迭代器设计模式的理论参考自《Design Patterns: Elements of Reusable Object-Oriented Software》[3]。
参考资料
[1] Oracle Java Documentation: The Iterator Interface
[2] Joshua Bloch. Effective Java. Addison-Wesley, 2018.
[3] Erich Gamma et al. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994.
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/28740.html