当前位置: 首页 > 科技观察

Java中的For循环与Foreach哪个更快

时间:2023-03-15 23:25:26 科技观察

在Java中有两种遍历集合的方法。一种是最基本的for循环,一种是jdk5引入的foreach。这样我们就可以更方便的遍历数组和集合。但是你有没有想过这两种方法呢?哪个更有效地遍历集合?for-each的实现方法For-each并不是一种新的语法,而是Java的一个语法糖。在编译时,编译器将这段代码变成一个迭代器实现,并编译成字节码。句法糖:句法糖,又译为糖衣语法,是英国计算机科学家PeterJ.Landin发明的一个术语,指的是在计算机语言中加入的某种语法。语法对语言的功能没有影响,反而更方便程序员使用。一般来说,语法糖的使用可以增加程序的可读性,从而减少程序代码出错的几率。我们可以通过执行命令javap-verbose-Testforeach反编译如下编译代码:publicclassTestForeach{Listintegers;publicvoidtestForeach(){for(Integeri:integers){}}}得到的详细字节码如下:publicvoidtestForeach();描述符:()V标志:ACC_PUBLIC代码:stack=1,locals=3,args_size=10:aload_01:getfield#2//Fieldintegers:Ljava/util/List;4:invokeinterface#3,1//InterfaceMethodjava/util/List.iterator:()Ljava/util/Iterator;9:astore_110:aload_111:invokeinterface#4,1//InterfaceMethodjava/util/Iterator.hasNext:()Z16:ifeq3219:aload_120:invokeinterface#5,1//InterfaceMethodjava/util/Iterator.下一个:()Ljava/lang/Object;25:checkcast#6//classjava/lang/Integer28:astore_229:goto1032:returnLineNumberTable:line11:0line13:29line14:32LocalVariableTable:StartLengthSlotNameSignature2902iLjava/lang/Integer;0330thisLtest/TestForeach;}这段字节码的大致意思是使用getfileld命令获取integers变量调用List.iterator获取iterator实例调用iterator.hasNext如果返回true则调用iterator.next方法。请看,这是迭代器遍历集合的实现逻辑。基准测试现在让我们使用for循环方法和for-each方法进行测试。publicclassForLoopTest{publicstaticvoidmain(String[]args){ListarrayList=newArrayList<>();for(inti=0;i<10000000;i++){arrayList.add(i);}longarrayListStartTime=System.currentTimeMillis();for(inti=0;i