在我们Java语言中,有for循环可以进行遍历,不过也还有其他方式实现这一操作,比如增强for循环以及迭代器,迭代器,又名为遍历器,顾名思义,那么迭代器是怎么工作运行的呢,底层究竟是怎样,迭代器与增强for循环之间有何联系,还有,每个实现类返回的Iterator接口可能会不一样,接下来一一举例说明。

  增强for循环底层是迭代器:

        也可以理解为,用增强for循环形式调动了迭代器的方法,最终也是以迭代器的形式去遍历

         在集合中添加一些元素,用增强for循环遍历集合

java增强 java增强for循环底层实现_增强for循环

接下来,看原码来阐述,将工具调成 “调试”界面,底层分三步看

  第一步,先调用了iterator方法,准备开始遍历

java增强 java增强for循环底层实现_迭代器_02

 第二步,再调用了hasNext方法,判断位置是否有元素

java增强 java增强for循环底层实现_java增强_03

 第三步,而后调用了Next方法,有元素去获取它

java增强 java增强for循环底层实现_java增强_04

 

上面说完了增强for循环与迭代器的联系,可能会想,既然增强for的底层是用的迭代器,那么迭代器是怎样运行的呢

       

        第一,创建集合,添加元素,集合对象名去调用iterator方法,此时程序已经准备好了遍历

java增强 java增强for循环底层实现_迭代器_05

 

        第二,不确定循环次数则使用while循环,条件判断为,用iterator调用hasNext方法,此时会有游标(指针),初始是指向索引值为0的位置,判断是否有元素,有元素,则告诉Next方法,去获取该位置元素,

java增强 java增强for循环底层实现_迭代器_06

        第三,循环内调用next方法,遍历打印集合元素,直到条件判断为false,结束循环

java增强 java增强for循环底层实现_迭代器_07

 

 

Iterator接口返回的不同实现类结果都会不一样

下图创建Collection集合,调用iterator方法,编译看左边,运行看右边,也就是说实质调用ArrayList类的iterator方法

java增强 java增强for循环底层实现_java_08

 

      进入调试页面, ArrayList类的iterator方法 (底层原码)

java增强 java增强for循环底层实现_java_09

 

将ArrayList类换成了LinkedList类,调用iterator方法,编译看左边,运行看右边,这里也就是调用LinkedList类的iterator方法

java增强 java增强for循环底层实现_增强for循环_10

 进入调试页面,LinkedList类的iterator方法 (底层原码)

java增强 java增强for循环底层实现_java_11

 

举了两个例子,也显示两种实现类底层原码,

返回值是Iterator接口,返回的是不同实现类对象,则每个实现的结果也会不同

每个实现类都会有自己Iterator接口里的Next,hasNext等等方法,所以并不能一概而论,迭代器实现原理要具体分类去阐述

就说说平时用的比较多的ArrayList类吧

ArrayList类对迭代器的实现原理:

进入调试页面看原码,如下图,不难看出里面的Itr类是成员内部类 ,也有成员变量 int cursor,初始为0

java增强 java增强for循环底层实现_java_12

接下来到了第17行代码,while循环

java增强 java增强for循环底层实现_迭代器_13

 

 进入原码,因为调用了hasNext方法,用游标判断下个索引值是否有元素,cursor即为游标,此时看第854行代码,这行很重要cursor!=size,size代表元素个数,而此时cursor为0(前面提过),元素个数有5个,size为5,条件判断则为true

java增强 java增强for循环底层实现_迭代器_14

 

 现在来看第18行代码,打印调用Next方法

java增强 java增强for循环底层实现_迭代器_15

调试页面看原码,这里858行代码就是Next方法,863行为核心代码,ArrayList集合底层是Object类型的数组,此处用Object类型数组来接收,同名的外部类成员变量(具体是什么值最下面图中有描述)

866行代码:i为0 加1,赋值给cursor,此时cursor为1,因为此时获取到了元素,所以cursor(游标)+1,否则程序结束了,不会+1

回到上面的cursor!=size作比较,去判断下个索引值位置有无元素

java增强 java增强for循环底层实现_java_16

 

鼠标光标移到elementDate变量上,会有一些信息,也正是上面集合中的元素

java增强 java增强for循环底层实现_java增强_17

 

ArrayList类对迭代器的实现原理概括:

调用iterator方法,此时准备好了遍历

使用while循环,条件判断为调用hasNext方法,会有cursor(游标)预判下个索引值位置是否有元素,有元素,会告诉Next方法,你有活干了(获取元素)

循环体里调用Next方法,拿到元素~