for(int i = 0; i < mylist.length; i++) { if(i < 5) { //do something } else { //do other stuff } }但是,我们可以使用 foreach 创建一个单独的索引 int 变量。例如:
int index = -1; for(int myint : mylist) { index++; if(index < 5) { //do something } else { //do other stuff } }现在写一个简单的类,其中有 foreachTest() 方法,该方法使用 forEach 迭代列表。
import java.util.List; // 堆代码 duidaima.com public class ForEachTest { List<Integer> intList; public void foreachTest(){ for(Integer i : intList){ } } }编译这个类时,编译器会在内部将这段代码转换为迭代器实现。小编通过执行 javap -verbose IterateListTest 反编译代码。
public void foreachTest(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: aload_0 1: getfield #19 // Field intList:Ljava/util/List; 4: invokeinterface #21, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator; 9: astore_2 10: goto 23 13: aload_2 14: invokeinterface #27, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object; 19: checkcast #33 // class java/lang/Integer 22: astore_1 23: aload_2 24: invokeinterface #35, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 29: ifne 13 32: return LineNumberTable: line 9: 0 line 12: 32 LocalVariableTable: Start Length Slot Name Signature 0 33 0 this Lcom/greekykhs/springboot/ForEachTest; StackMapTable: number_of_entries = 2 frame_type = 255 /* full_frame */ offset_delta = 13 locals = [ class com/greekykhs/springboot/ForEachTest, top, class java/util/Iterator ] stack = [] frame_type = 9 /* same */从上面的字节码我们可以看到:
import java.util.ArrayList; import java.util.List; public class IterateListTest { public static void main(String[] args) { List<Integer> mylist = new ArrayList<>(); for (int i = 0; i < 1000000; i++) { mylist.add(i); } long forLoopStartTime = System.currentTimeMillis(); for (int i = 0; i < mylist.size(); i++) {mylist.get(i);} long forLoopTraversalCost =System.currentTimeMillis()-forLoopStartTime; System.out.println("for loop traversal cost for ArrayList= "+ forLoopTraversalCost); long forEachStartTime = System.currentTimeMillis(); for (Integer integer : mylist) {} long forEachTraversalCost =System.currentTimeMillis()-forEachStartTime; System.out.println("foreach traversal cost for ArrayList= "+ forEachTraversalCost); } }结果如下: