在我们Java语言中,有for循环可以进行遍历,不过也还有其他方式实现这一操作,比如增强for循环以及迭代器,迭代器,又名为遍历器,顾名思义,那么迭代器是怎么工作运行的呢,底层究竟是怎样,迭代器与增强for循环之间有何联系,还有,每个实现类返回的Iterator接口可能会不一样,接下来一一举例说明。
增强for循环底层是迭代器:
也可以理解为,用增强for循环形式调动了迭代器的方法,最终也是以迭代器的形式去遍历
在集合中添加一些元素,用增强for循环遍历集合
接下来,看原码来阐述,将工具调成 “调试”界面,底层分三步看
第一步,先调用了iterator方法,准备开始遍历
第二步,再调用了hasNext方法,判断位置是否有元素
第三步,而后调用了Next方法,有元素去获取它
上面说完了增强for循环与迭代器的联系,可能会想,既然增强for的底层是用的迭代器,那么迭代器是怎样运行的呢
第一,创建集合,添加元素,集合对象名去调用iterator方法,此时程序已经准备好了遍历
第二,不确定循环次数则使用while循环,条件判断为,用iterator调用hasNext方法,此时会有游标(指针),初始是指向索引值为0的位置,判断是否有元素,有元素,则告诉Next方法,去获取该位置元素,
第三,循环内调用next方法,遍历打印集合元素,直到条件判断为false,结束循环
Iterator接口返回的不同实现类结果都会不一样
下图创建Collection集合,调用iterator方法,编译看左边,运行看右边,也就是说实质调用ArrayList类的iterator方法
进入调试页面, ArrayList类的iterator方法 (底层原码)
将ArrayList类换成了LinkedList类,调用iterator方法,编译看左边,运行看右边,这里也就是调用LinkedList类的iterator方法
进入调试页面,LinkedList类的iterator方法 (底层原码)
举了两个例子,也显示两种实现类底层原码,
返回值是Iterator接口,返回的是不同实现类对象,则每个实现的结果也会不同
每个实现类都会有自己Iterator接口里的Next,hasNext等等方法,所以并不能一概而论,迭代器实现原理要具体分类去阐述
就说说平时用的比较多的ArrayList类吧
ArrayList类对迭代器的实现原理:
进入调试页面看原码,如下图,不难看出里面的Itr类是成员内部类 ,也有成员变量 int cursor,初始为0
接下来到了第17行代码,while循环
进入原码,因为调用了hasNext方法,用游标判断下个索引值是否有元素,cursor即为游标,此时看第854行代码,这行很重要cursor!=size,size代表元素个数,而此时cursor为0(前面提过),元素个数有5个,size为5,条件判断则为true
现在来看第18行代码,打印调用Next方法
调试页面看原码,这里858行代码就是Next方法,863行为核心代码,ArrayList集合底层是Object类型的数组,此处用Object类型数组来接收,同名的外部类成员变量(具体是什么值最下面图中有描述)
866行代码:i为0 加1,赋值给cursor,此时cursor为1,因为此时获取到了元素,所以cursor(游标)+1,否则程序结束了,不会+1
回到上面的cursor!=size作比较,去判断下个索引值位置有无元素
鼠标光标移到elementDate变量上,会有一些信息,也正是上面集合中的元素
ArrayList类对迭代器的实现原理概括:
调用iterator方法,此时准备好了遍历
使用while循环,条件判断为调用hasNext方法,会有cursor(游标)预判下个索引值位置是否有元素,有元素,会告诉Next方法,你有活干了(获取元素)
循环体里调用Next方法,拿到元素~
综上是我对迭代器原理的描述,觉得文章写的不错,可以点赞收藏哦!