今天敲代码看到一个例子,在迭代器遍历的时候插入元素报错,有提到原因,但没有提到删除元素的方法,就自己试了一下。
import java.util.*;
public class IteratorTest {
public static void main(String[] args) {
List<String> ll = new LinkedList<String>();
ll.add("ad");
ll.add("bd");
ll.add("dd");
ll.add("dd");
for (Iterator<String> dd = ll.iterator(); dd.hasNext();) {
String str = dd.next();
System.out.println(str);
if (str.equals("bd")) {
ll.remove(str);
}
}
System.out.println(ll);
}
}
出现了以下的错误
然后很奇怪,就去上网查了出现这样的原因。最后找到了,虽然用到了迭代器,但删除用错了方法。原因是当Iterator.remove方法导致LinkedList列表发生变化时,它会更新cursor来同步这一变化。但其他方式导致的LinkedList变化,Iterator是无法感知的。LinkedList不会主动通知Iterator。Iterator做checkForComodification检查,就以异常抛出,所以就出现了上面的异常。,这里需要将 ll.remove(str)改为 dd.remove()。
import java.util.*;
public class IteratorTest {
public static void main(String[] args) {
List<String> ll = new LinkedList<String>();
ll.add("ad");
ll.add("bd");
ll.add("dd");
ll.add("dd");
for (Iterator<String> dd = ll.iterator(); dd.hasNext();) {
String str = dd.next();
System.out.println(str);
if (str.equals("bd")) {
dd.remove();
}
}
System.out.println(ll);
}
}
这样就正常运行,结果也无误了