作为一个程序员,除了每天写一大堆ifelse之外,写得最多的还有for循环。我们都知道Java中常用的for循环有两种方式,一种是使用for循环,另一种是使用foreach,如果你问你,这两种方式哪种效率最高,你的答案是什么?阿芬今天就带你看看。首先,我们通过代码实际测试一下。在计算耗时之前,我们先创建大小集合,然后通过不断获取集合的内容来测试耗时。packagecom.example.demo;importjava.util.ArrayList;importjava.util.List;/***
*功能:
*作者:@authorziyou
*日期:2022-06-2612:22
*描述:无
*/publicclassForTest{publicstaticvoidmain(String[]args){//获取一个指定大小的List集合Listlist=getList(1000000);//启动for循环运算longstartFor=System.currentTimeMillis();for(inti=0;igetList(intsize){Listlist=newArrayList<>();for(inti=0;i*功能:
*作者:@authorziyou
*日期:2022-06-2613:06
*描述:无
*/publicclassForEachTest{Listlist;publicvoidmain(String[]args){for(Integerinteger:list){}}}通过javacForEachTest.java编译成class文件,再通过javap-vForEachTest反编译得到如下字节码内容:Classfile/Users/silence/Downloads/demo/src/test/java/com/example/demo/ForEachTest.class最后修改时间2022-6-26;大小643字节MD5校验和9cf01f7c8c87c2b4d62c39d437025b7f编译自“ForEachTest.java”公共类com.example.demo.ForEachTest次要版本:0主要版本:52标志:ACC_PUBLIC,ACC_SUPERConstantMeodl3#1java/refpool#1///Object."":()V#2=Fieldref#7。#24//com/example/demo/ForEachTest.list:Ljava/util/List;#3=InterfaceMethodref#25.#26//java/util/List.iterator:()Ljava/util/Iterator;#4=InterfaceMethodref#27.#28//java/util/Iterator.hasNext:()Z#5=InterfaceMethodref#27.#29//java/util/Iterator.next:()Ljava/lang/Object;#6=Class#30//java/lang/Integer#7=Class#31//com/example/demo/ForEachTest#8=Class#32//java/lang/Object#9=Utf8列表#10=Utf8Ljava/util/列表;#11=Utf8签名#12=Utf8Ljava/util/List;#13=Utf8#14=Utf8()V#15=Utf8Code#16=Utf8LineNumberTable#17=Utf8main#18=Utf8([Ljava/lang/String;)V#19=Utf8StackMapTable#20=类#33//java/util/Iterator#21=Utf8SourceFile#22=Utf8ForEachTest.java#23=NameAndType#13:#14//"":()V#24=NameAndType#9:#10//列表:Ljava/util/列表;#25=Class#34//java/util/List#26=NameAndType#35:#36//iterator:()Ljava/util/Iterator;#27=Class#33//java/util/Iterator#28=NameAndType#37:#38//hasNext:()Z#29=NameAndType#39:#40//next:()Ljava/lang/Object;#30=Utf8java/lang/Integer#31=Utf8com/example/demo/ForEachTest#32=Utf8java/lang/Object#33=Utf8java/util/Iterator#34=Utf8java/util/List#35=Utf8迭代器#36=Utf8()Ljava/util/Iterator;#37=Utf8hasNext#38=Utf8()Z#39=Utf8next#40=Utf8()Ljava/lang/Object;{java.util.Listlist;描述符:Ljava/util/List;标志:签名:#12//Ljava/util/List;公共com.example.demo.ForEachTest();描述符:()Vflags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:returnLineNumberTable:第13行:0publicvoidmain(java.lang.String[]);描述符:([Ljava/lang/String;)Vflags:ACC_PUBLICCode:stack=1,locals=4,args_size=20:aload_01:getfield#2//Fieldlist:Ljava/util/List;4:invokeinterface#3,1//InterfaceMethodjava/util/List.iterator:()Ljava/util/Iterator;9:astore_210:aload_211:invokeinterface#4,1//接口方法java/util/Iterator.hasNext:()Z16:ifeq3219:aload_220:invokeinterface#5,1//接口方法java/util/Iterator.next:()Ljava/lang/目的;25:checkcast#6//classjava/lang/Integer28:astore_329:goto1032:returnLineNumberTable:line17:0line19:29line20:32StackMapTable:number_of_entries=2frame_type=252/*append*/offset_delta=10locals=[classjava/util/Iterator]frame_type=250/*chop*/offset_delta=21}SourceFile:"ForEachTest.java"反编译的内容很多,就不一一解释了,可以看到这段代码的大致意思是使用getfield命令获取变量,调用List.iterator获取iterator实例再调用iterator.hasNext。如果它返回true,则调用iterator.next方法。这是这里写的迭代器遍历集合的实现逻辑有朋友会问,那我遇到List集合就用for循环代替foreach。毕竟前者效率更高。那我们再看另一种情况,这里我们将ArrayList换成LinkedList,代码如下:for(inti=0;i