Arraylist使用remove(Object)方法 抛出的异常java.util.ConcurrentModificationException
工作中碰到个ConcurrentModificationException。代码如下:
List list = ...;for(Iterator iter = list.iterator(); iter.hasNext();) { Object obj = iter.next(); ... if(***) { list.remove(obj); }}
public interface Iterator<E> { boolean hasNext(); E next(); void remove();}public interface Collection<E> extends Iterable<E> { ... Iterator<E> iterator(); boolean add(E o); boolean remove(Object o); ...}这里有两个remove方法
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { //AbstractCollection和List都继承了Collection protected transient int modCount = 0; private class Itr implements Iterator<E> { //内部类Itr int cursor = 0; int lastRet = -1; int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public E next() { checkForComodification(); //特别注意这个方法 try { E next = get(cursor); lastRet = cursor++; return next; } catch(IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); //执行remove对象的操作 if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; //重新设置了expectedModCount的值,避免了ConcurrentModificationException的产生 } catch(IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) //当expectedModCount和modCount不相等时,就抛出ConcurrentModificationException throw new ConcurrentModificationException(); } } }
public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false;}private void fastRemove(int index) { modCount++; //只增加了modCount ....}