黑马程序员技术交流社区

标题: 关于迭代器能否遍历数组的问题 [打印本页]

作者: SkyBlack    时间: 2016-7-20 14:10
标题: 关于迭代器能否遍历数组的问题
求解,迭代器能否遍历数组,如果不能为什么增强for可以遍历数组呢
作者: cat73    时间: 2016-7-20 14:52
只要某个类实现了 java.lang.Iterable 接口,那么它就可以被 foreach 遍历。
对于这些类,编译后反编译就可以看到代码里自动调用了 iterator 方法来实现遍历。

而数组算是个很特殊的东西了,编译后再反编译,你会发现根本没出现 iterator,而是跟使用 for 控制下标来遍历的方式类似的一种结果。

也就是说 Java 在编译的时候会检查,如果这是一个类且实现了  java.lang.Iterable 接口,则使用 iterator 方法获取迭代器来进行遍历。
如果是数组,则使用 for + 下标的形式遍历。
其余的抛出编译错误。
作者: cat73    时间: 2016-7-20 14:59
https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14
你可以看 14.14.2 部分,有提到:

如果被遍历的是 Iterable 的子类则编译成下面这种:
  1. for (I #i = Expression.iterator(); #i.hasNext(); ) {
  2.     {VariableModifier} TargetType Identifier =
  3.         (TargetType) #i.next();
  4.     Statement
  5. }
复制代码

如果是数组则编译成下面这种:
  1. for (int #i = 0; #i < #a.length; #i++) {
  2.     {VariableModifier} TargetType Identifier = #a[#i];
  3.     Statement
  4. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2