1. 迭代器 Iterator 是什么?
Iterator 接口提供遍历任何 Collection 的接口,我们可以从一个 Collection 中使用迭代器方法来获取迭代器的实例。
代码:
// List 获取迭代器
List<Integer> list = new ArrayList<>();
Iterator<Integer> i1 = list.iterator();
// Set 获取迭代器
Set<String> set = new HashSet<>();
Iterator<String> i2 = set.iterator();
2. 如何使用
使用 hasNext()
判断是否有下一个元素, 使用 next()
获取下一个元素
迭代器允许调用者在迭代过程中移除元素
List<Integer> list = new ArrayList<>();
// 在集合中添加元素
list.addAll(Arrays.asList(1,2,3,4,5));
// 获取迭代器
Iterator<Integer> i1 = list.iterator();
while (i1.hasNext()) { // 判断是否有下一个元素
Integer obj = i1.next(); // 获取下一个元素
System.out.println(obj);
if (obj.equals(2)) { // 如果值是2,删除当前元素
i1.remove();
}
}
System.out.println(list); // [1,3,4,5]
Iterator 的特点是更加安全,因为它可以确保在遍历当前集合的时候,如果集合中的元素数量发生了更改(增删操作),会抛出ConcurrentModificationException
异常
例如: 在获取迭代器后,又向列表中添加元素
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(1, 2, 3, 4, 5));
Iterator<Integer> i1 = list.iterator();
list.add(9); // 在获取过迭代器后,又向列表中添加元素,引发异常
while (i1.hasNext()) {
Integer obj = i1.next();
System.out.println(obj);
if (obj.equals(2)) {
i1.remove();
}
}
System.out.println(list);
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at base.T3Iterator.main(T3Iterator.java:31)
若在获取迭代器后,修改指定位置的值,不会引发并发修改异常
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(1, 2, 3, 4, 5));
Iterator<Integer> i1 = list.iterator();
list.set(0, 9);
// iterator
while (i1.hasNext()) {
Integer obj = i1.next();
System.out.println(obj);
if (obj.equals(2)) {
i1.remove();
}
}
System.out.println(list);
3. 小结
- Iterator 接口提供遍历任何 Collection 接口,我们可以从一个 Collection 中使用迭代器方法获取迭代器实例。
- 迭代器允许调用者在迭代过程中移除元素
- Iterator 更加安全,因为它可以确保在遍历集合元素的时候,集合的长度不可改变,如果操作了该集合(增删操作),会引发
ConcurrentModificationException
(并发修改)异常