浅谈迭代器
迭代器
什么是迭代器
以下情况是一种比较常见的迭代
for(int i = 0;i < 10; i++){
System.out.println(i);
}
这种迭代不具有普适性,因为集合中的set集合是无序、不重复、无索引的。此时的我们就没有利用for循环来进行遍历,像这种情况我们就可以用迭代器的方式来对集合进行遍历。
迭代器
Java迭代器(Iterator)是 Java 集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
工作原理
- 创建一个类似指针的对象,它会指向当前数据结构的起始位置
- 每当调用next()方法,他都会进行一次移动,移动到下一个位置
- 接下来不断调用next()方法,迭代器不断向后移动,直到最后一个成员。
- 遍历完成之后,它不会进行复位,所以迭代是一次性的。
注意点
- 报错 NoSuchElementException (当迭代器循环结束后继续使用next()方法就会报错。)
- 迭代器遍历完成,指针不会复位
- 循环中只能用一次next
- 迭代器遍历时,不能用集合的方式进行增加或者删除。可以用迭代器的方式。
- 迭代器迭代是不依赖索引的。
- Java 迭代器是一种单向遍历机制,即只能从前往后遍历集合中的元素,不能往回遍历。
针对于注意点1:
NoSuchElementException
常用方法
我们可以在JDK帮助文档中查到Iterator常用的几个方法
调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext() 用于检测集合中是否还有元素。
调用 it.remove() 将迭代器返回的元素删除。
获取一个迭代器对象
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class A01_CollectionDemo1 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList();
//利用add方法添加数据
coll.add("asd");
coll.add("zxc");
coll.add("qwe");
//获取迭代器对象
Iterator<String> it = coll.iterator();
//利用迭代器获取到集合中的第一个元素
System.out.println(it.next());
}
}
循环获取集合元素
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
删除元素
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(12);
numbers.add(8);
numbers.add(2);
numbers.add(23);
Iterator<Integer> it = numbers.iterator();
while(it.hasNext()) {
Integer i = it.next();
if(i < 10) {
it.remove(); // 删除小于 10 的元素
}
}
System.out.println(numbers);
}
注意点:
在迭代遍历中不可以以集合的方式进行删除,如果使用集合方式进行删除,将会报错ConcurrentModificationException 并发修改异常。
这个涉及到了 fast-fail 机制(快速失败),可以提前预料遍历失败情况,防止数组越界异常
必须使用迭代器的删除方式 it.remove();
Java中的迭代器用法以及注意点基本就这些,感谢您的观看,希望对您有所帮助。