无情 @ Thu Apr 07 23:30:59 CST 2016 阅读(1886)
Collection


今天一朋友去网易面试了,有一题是关于forEach的,他居然没回答上来,我就闲着无聊今天就重温了一下。

foreach语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢?


在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterablei接口,该接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动.


示例代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println("1=============");
for (String str : list) {
System.out.println(str);
}
System.out.println("2=============");
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
System.out.println(string);
}
}
}


通过javac Test.java  编译成字节码

然后通过javap -c Test  查看字节码 (如图:)


发现红色区域第一块和第二块 最终被编译器转为了对Iterator.next()的调用

这边还发现一个比较有趣的现象:在取Iterator.next()之后并在把该值load进内容栈之前,编译器调用了checkcast  java.lang.String方法来进行类型安全检查,jdk应该是采用这个来检测并抛出ClassCastException的。