Iterator 的用法
Modifier and Type | Method and Description |
---|---|
default void | forEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。 |
boolean | hasNext() 如果迭代具有更多元素,则返回 |
E | next() 返回迭代中的下一个元素。 |
default void | remove() 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 |
Demo:
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo01 {
public static void main(String[] args) {
List<String> lists = new ArrayList<String>();
lists.add("A");
lists.add("B");
lists.add("C");
lists.add("D");
lists.add("E");
lists.add("F");
Iterator<String> iter = lists.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
结果:
A
B
C
D
E
F
remove()方法的使用:
while (iter.hasNext()) {
String str = iter.next();
if ("A".equals(str)) {
iter.remove();
}
else {
System.out.println(str);
}
结果:A被删除了。
B
C
D
E
F
使用Iterator 的remove()方法时有个问题:我们在迭代输出的时候,一定不要通过集合去操作它,会出现问题
while (iter.hasNext()) {
lists.remove(2);//通过集合的remove()去删除第三个元素
System.out.println(iter.next());
}
结果:出现错误
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at collection.IteratorDemo01.main(IteratorDemo01.java:19)
总结:如果对正在被迭代的集合进行结构上的改变(即对该集合使用add,remove,或者clear方法),那么迭代器就不再合法(并且在其后使用该迭代器,将会有ConcurrentModificationException异常抛出),如果使用迭代器自己的remove方法,那么这个迭代器仍然时合法的。
但是为什么呢?不清楚。。。希望大佬可以解释一下