JAVA中的Iterator
Iterator 接口主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一接口。
Iterator接口中定义了4个方法。
boolean hasNext(): 判断是否有下一个可访问的元素,如果有返回true,否则返回false。
Object next(): 返回集合中的下一个元素
void remove(): 删除集合里上一次next方法返回的元素。
void forEachRemaining(Consumer action), 这是java8为Iterator 新增的默认方法,该方法可以使用Lambda表达式来遍历集合元素。
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<String> card = new ArrayList<String>();
card.add("蛇发女妖佐拉");
card.add("恩佐斯");
card.add("克苏恩");
card.add("亚煞极");
card.add("巫妖王");
Iterator<String> iterator = card.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行截图:
Iterator仅用于遍历集合,本身并没有盛装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
然而使用Lambda表达式遍历Iterator显得更方便一些。
iterator.forEachRemaining(e -> System.out.println("迭代集合元素是:"+e));
void forEachRemaining(Consumer action) 方法,参数使用的是函数式接口。当程序调用Iterator的forEachRemaining(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer 的accept(T t)方法(该接口中唯一的一个抽象方法)
运行截图:
Iterator迭代器采用的是快速失败机制,一旦在迭代过程中检测到该集合已经被修改,程序就会立即引发ConcurrentModificationException异常。
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<String> card = new ArrayList<String>();
card.add("蛇发女妖佐拉");
card.add("恩佐斯");
card.add("克苏恩");
card.add("亚煞极");
card.add("巫妖王");
Iterator<String> iterator = card.iterator();
System.out.println("--------------采用Lambda表达式遍历---------------");
iterator.forEachRemaining(e -> System.out.println("迭代集合元素是:"+e));
System.out.println("--------------删除2号位置的元素---------------");
card.remove(2);
System.out.println("--------------使用foreach遍历集合元素---------------");
for(String e : card){
System.out.println(e);
}
System.out.println("--------------再次使用迭代器访问---------------");
//iterator.forEachRemaining(e -> System.out.println("迭代集合元素是:"+e));
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行截图:
从上图可以看出,修改了集合中的元素后,迭代器就不能用了。但是请注意我注释掉的那一串代码,当运行这一串代码的时候并不会出现异常,而是什么也不输出。总之就是如果集合变了,要么再一次声明迭代器,要么使用foreach循环直接打印输出。
最后对于remove()强调一点,使用Iterator.remove()是可以直接删除集合中的元素的。打个比喻就是,Iterator迭代器和原集合两个人共用一个心脏。但是需要注意的是,在遍历时,迭代变量所获得的是集合元素的值,而不是集合元素本身。