public class IteratorUnderLying {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
/*
iterator() 生成一个迭代器对象,默认指向集合的0索引处
hasNext() 判断当前指向的位置是否有元素
next() 1.获取元素 2.移动指针
1.int Iterator:会调用内部类(其实就是ArrayList的迭代器,所以当我们多次调用这个方法时,相当于创建了多个迭代器的对象),创建三个变量:
int cursor:光标:迭代器中的指针(初始为0)
int lastRet:上一次操作的索引,例如初始是0,前一个就是-1
int expectedModCount = modCount:
modCount:集合变化的次数,add或者remove方法中modCount会++
2.hasNext方法:
会判断cursor != size,返回true或false
3.next方法:
1.校验修改集合的次数
1.判断modCount != expectedModCount,现在集合修改的次数和创建对象时修改的次数
如果为true则报错并发修改异常
结论:如何避免并发修改异常:在使用迭代器或者是增强for遍历集合的过程中,不要使用集合的方法添加或者删除元素即可
2.定义i = cursor:记录当前指针指向的索引位置
3.判断i >= size,如果ture则报错没有这个元素异常
4.创建一个elementData = ArrayList.this.elementData,提高效率,不需要从外部类去找数组
5.cursor = i + 1; 将当前指针往右移动一个位置
6.return (E) elementData[lastRet = i]; 获取elementData的i索引元素并返回
*/
Iterator<String> it = list.iterator();
while (it.hasNext()){
String str = it.next();
System.out.println(str);
}
}
}