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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。