public E next() {
checkForComodification();//检查并发修改异常的方法
//实际上就是将迭代器记录的集合长度变化的次数
//与实际集合长度变化的次数进行了比较.
//如果两个值不相等,就会报并发修改异常.
int i = cursor; //第一次的时候 会把0赋值给局部变量i
if (i >= size) //如果指针大于等于集合的长度了,此时会报没有元素异常
throw new NoSuchElementException();//即当前指向的索引没有元素
Object[] elementData = ArrayList.this.elementData;//elementData 集合中存数据的那个数组.
//有了一个副本.记录了集合中存数据的那个数组的地址值.
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1; // 就相当于把游标(指针)往后移动了一格
return (E) elementData[lastRet = i];//第一次的时候i = 0 相当于elementData[0].获取0索引上的元素
}
```
public E next() {
checkForComodification();//expectedModCount 和 modCount进行比较
int i = cursor;
if (i >= size) //如果指针大于等于长度
throw new NoSuchElementException();//报没有这个元素异常
Object[] elementData = ArrayList.this.elementData;//将集合拷贝一个副本elementData
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;//next每调用一次指针就往后移动一个。
return (E) elementData[lastRet = i];//从副本中获取相应的值
}
------
final void checkForComodification() {
if (modCount != expectedModCount)//如果两者不匹配就并发修改异常
throw new ConcurrentModificationException();
}
------
//再用迭代器进行删除的时候:
//1,不能创建完迭代器对象后直接删除
//2,不能连续删除两次
public void remove() {
if (lastRet < 0) //为了防止迭代器刚创建的时候就调用remove方法
throw new IllegalStateException();
checkForComodification();