Java for each实现机制代码原理解析
源测试代码如下
publicclassForEachTest{
publicvoidtest4Iterate(Iterablestrings){
for(Stringstr:strings){
System.out.println(str);
}
}
publicvoidtest4Array(String[]strings){
for(Stringstr:strings){
System.out.println(str);
}
}
}
执行编译命令
javacForEachTest.java
使用idea查看反编的Java文件
importjava.util.Iterator;
publicclassForEachTest{
publicForEachTest(){
}
publicvoidtest4Iterate(Iterablevar1){
Iteratorvar2=var1.iterator();
while(var2.hasNext()){
Stringvar3=(String)var2.next();
System.out.println(var3);
}
}
publicvoidtest4Array(String[]var1){
String[]var2=var1;
intvar3=var1.length;
for(intvar4=0;var4
执行指令查看对应的汇编指令
javap-cForEachTest.class
Compiledfrom"ForEachTest.java"
publicclassForEachTest{
publicForEachTest();
Code:
0:aload_0
1:invokespecial#1//Methodjava/lang/Object."":()V
4:return
publicvoidtest4Iterate(java.lang.Iterable);
Code:
0:aload_1
1:invokeinterface#2,1//InterfaceMethodjava/lang/Iterable.iterator:()Ljava/util/Iterator;
6:astore_2
7:aload_2
8:invokeinterface#3,1//InterfaceMethodjava/util/Iterator.hasNext:()Z
13:ifeq36
16:aload_2
17:invokeinterface#4,1//InterfaceMethodjava/util/Iterator.next:()Ljava/lang/Object;
22:checkcast#5//classjava/lang/String
25:astore_3
26:getstatic#6//Fieldjava/lang/System.out:Ljava/io/PrintStream;
29:aload_3
30:invokevirtual#7//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
33:goto7
36:return
publicvoidtest4Array(java.lang.String[]);
Code:
0:aload_1
1:astore_2
2:aload_2
3:arraylength
4:istore_3
5:iconst_0
6:istore4
8:iload4
10:iload_3
11:if_icmpge34
14:aload_2
15:iload4
17:aaload
18:astore5
20:getstatic#6//Fieldjava/lang/System.out:Ljava/io/PrintStream;
23:aload5
25:invokevirtual#7//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
28:iinc4,1
31:goto8
34:return
}
由反编类和汇编指令可以看到对于Iterable类,是通过其迭代方法执行foreach,而对于数组是通过传统的for循环方式执行迭代
因为集合类的foreach是基于迭代器循环的,所以根据迭代器实现的不同,foreach的性能也会不同
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。