📌 目录
- 什么是 Iterator?
- Iterator 的工作原理
- 创建和使用 Iterator
- Iterator 常用方法
- 4.1
hasNext()
- 4.2
next()
- 4.3
remove()
- 4.1
- Iterator 和 ListIterator 的区别
- Iterator 性能
- 总结
- 参考资料
- 出站链接
1. 什么是 Iterator?
Iterator
是 Java 集合框架中的一个接口,用于遍历集合中的元素。通过 Iterator
,我们可以以一种统一的方式访问各种集合类型(如 List
、Set
等)中的元素,而无需关心集合的具体实现。它提供了一种可控的遍历方式,能够避免使用传统的索引方式访问集合元素。
Iterator
主要用于以下场景:
- 遍历集合中的元素。
- 删除集合中的元素。
- 通过方法提供更好的控制,避免使用索引遍历时可能出现的并发修改问题。
2. Iterator 的工作原理
Iterator
提供了一种通过顺序访问集合元素的方法。每个集合类都可以通过 iterator()
方法返回一个 Iterator
对象,用于对该集合进行遍历。迭代器提供了三种主要操作:
- hasNext():检查集合中是否还有元素。
- next():返回集合中的下一个元素。
- remove():删除当前元素。
3. 创建和使用 Iterator
使用 Iterator
遍历 List
集合
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
Iterator<String> iterator = list.iterator(); // 获取 Iterator 对象
while (iterator.hasNext()) { // 判断是否有下一个元素
String element = iterator.next(); // 获取下一个元素
System.out.println(element); // 打印元素
}
}
}
使用 Iterator
遍历 Set
集合
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("C++");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
4. Iterator 常用方法
4.1 hasNext()
- 功能:检查集合中是否还有未遍历的元素。
- 返回值:如果集合中有下一个元素,则返回
true
,否则返回false
。
boolean hasNext = iterator.hasNext();
4.2 next()
- 功能:返回集合中的下一个元素,并将指针移动到下一个元素。
- 返回值:返回下一个元素。
- 异常:如果没有下一个元素,调用
next()
方法会抛出NoSuchElementException
异常。
String element = iterator.next();
4.3 remove()
- 功能:删除集合中的当前元素,即最后一次通过
next()
返回的元素。 - 注意:
remove()
方法只能在next()
方法之后调用。如果没有调用next()
,调用remove()
会抛出IllegalStateException
异常。
iterator.remove(); // 删除当前元素
5. Iterator 和 ListIterator 的区别
特性 | Iterator | ListIterator |
---|---|---|
支持的集合类型 | List , Set , Queue | 仅支持 List |
方向 | 单向遍历(从前到后) | 双向遍历(从前到后和从后到前) |
增强功能 | 不支持插入和修改集合 | 支持插入、删除、修改集合 |
支持的位置指针操作 | 不支持 | 支持向前和向后移动指针 |
ListIterator
是Iterator
的一个子接口,除了支持单向遍历,还支持双向遍历。ListIterator
提供更多的操作,例如add()
(在当前元素前插入元素)、set()
(修改当前元素的值)等。
6. Iterator 性能
Iterator
的性能通常与集合本身的实现有关。例如,ArrayList
提供的 Iterator
性能非常高,因为它直接基于数组存储数据;而对于 LinkedList
,Iterator
的性能会稍微差一些,因为它需要通过链表节点进行遍历。
在遍历集合时,Iterator
通常比传统的基于索引的遍历方法(例如使用 for
循环)更具优势,特别是在需要删除元素的情况下。通过 Iterator
删除元素不会引起 ConcurrentModificationException
,而直接修改集合可能会导致此异常。
7. 总结
Iterator
提供了一种统一的方式来遍历Collection
中的元素,避免了直接使用索引的缺点。- 它是用于集合元素遍历和删除的理想选择,特别是在需要对集合进行修改时。
Iterator
的主要方法有:hasNext()
、next()
和remove()
,而ListIterator
是其子接口,提供了更多的操作。Iterator
在多线程环境下使用时要特别注意,并发修改会导致ConcurrentModificationException
异常。
8. 参考资料
- Java Collections Framework Documentation
- GeeksforGeeks – Iterator in Java
- Baeldung – Guide to Java Iterator
发表回复