private class Itr implements Iterator<E> {
int cursor; // index of next element to return (要返回的下一个元素的索引,初始值为0)
int lastRet = -1; // index of last element returned; -1 if no such (返回的最后一个元素的索引 如果没有元素就是-1,初始值为-1)
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() { //判断数组中是否还有可以迭代的元素
return cursor != size; //如果要返回的下一个元素的索引值不等于数组的大小 true
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification(); //首先要检查在迭代过程中,集合是否发生改变,即是否产生了arraylist.add(),arraylist.remove()等行为
int i = cursor; //如果在迭代过程中集合发生了改变,就会抛出异常
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData; //在ArrayList类中的类中(如ArrayList类中的迭代器)去访问外部类的实例的一种方式
if (i >= elementData.length) //ArrayList中实际上是用elementData数组来存储元素的
throw new ConcurrentModificationException(); //如果当前元素的索引i = cursor >= 数组的长度,抛出异常
cursor = i + 1; //游标后移
return (E) elementData[lastRet = i]; //返回当前元素
}
-
next() - 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。
-
hasNext() - 用于判断集合中是否还有下一个元素可以访问。
增强for循环
for(数据类型 变量名 :要被遍历的集合名|数组名){
}
int [ ]nums = {1, 2, 3, 4, 5, 6};
for(int i : nums){
} //这个i就相当于充当了一个中间变量的作用
增强for循环遍历集合底层依赖的就是迭代器,当我们使用增强for循环时,编译器会自动帮我们生成一个迭代器对象。