Java中LinkedList删除元素

今天敲代码看到一个例子,在迭代器遍历的时候插入元素报错,有提到原因,但没有提到删除元素的方法,就自己试了一下
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);
    }
}

这样就正常运行,结果也无误了


猜你喜欢

转载自blog.csdn.net/lsj741223/article/details/80428550