关于java迭代器删除倒数第二个元素不会报错的原因的分析
1.前言
今天学弟来问我一个问题,在java的迭代器中,利用集合删除时会报错(java.util.ConcurrentModificationException),但是发现在删除倒数第二个元素的时候,就不会报错.我一时也没回答上来,后来查看了源码之后,有所理解,总结形成了这篇博客.
2.首先回答为什么删除倒数第二个不会报错
如图:
我们可以显然发现,在输出框里,只有0,1,2并没有3,那就说明在删除完2之后,在执行hasNext方法的时候,循环结束了,那么我们先去看hasNext方法的源码
hasNext()源码
public boolean hasNext() {
return cursor != size();
}
显然可以发现,结束循环的原因是因为cursor和size()相等了,那么这两个值分别是什么呢?我们进一步了解
在这之前我们先了解一组继承关系
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
可以显然发现:ArrayList,AbstractList,AbstractCollection三者具有继承关系
然后我们查看源码,发现AbstractCollection中有这样一个方法:
public abstract int size