For-each は新しい構文ではなく、Java の構文シュガーです。コンパイル時に、コンパイラーはこのコードをイテレーター実装に変換し、バイトコードにコンパイルします。コマンド javap-verbose-Testforeach
を実行すると、次のコンパイル済みコードを逆コンパイルできます。
public class TestForeach { List<Integer> integers; public void testForeach(){ for(Integer i : integers){ } } }
取得された詳細なバイトコードは次のとおりです。
public void testForeach(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: aload_0 1: getfield #2 // Field integers:Ljava/util/List; 4: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator; 9: astore_1 10: aload_1 11: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 16: ifeq 32 19: aload_1 20: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object; 25: checkcast #6 // class java/lang/Integer 28: astore_2 29: goto 10 32: return LineNumberTable: line 11: 0 line 13: 29 line 14: 32 LocalVariableTable: Start Length Slot Name Signature 29 0 2 i Ljava/lang/Integer; 0 33 0 this Ltest/TestForeach; }
このバイトコードの概要つまり、getfileld
コマンドを使用して integers
変数を取得し、List.iterator
を呼び出してイテレータ インスタンスを取得し、iterator.hasNext## を呼び出します。 #。
true が返された場合は、
iterator.next メソッドを呼び出します。
public class ForLoopTest { public static void main(String[] args) { List<Integer> arrayList = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { arrayList.add(i); } long arrayListStartTime = System.currentTimeMillis(); for (int i = 0; i < arrayList.size(); i++) { arrayList.get(i); } long arrayListCost =System.currentTimeMillis()-arrayListStartTime; System.out.println("ArrayList for loop traversal cost: "+ arrayListCost); long arrayListForeachStartTime = System.currentTimeMillis(); for (Integer integer : arrayList) { } long arrayListForeachCost =System.currentTimeMillis()-arrayListForeachStartTime; System.out.println("ArrayList foreach traversal cost: "+ arrayListForeachCost);
繰り返しになりますが、テスト結果は次のとおりです。
ArrayList の最下層は、配列を使用して要素を格納します。配列は連続したメモリ空間です。データはインデックスを通じて取得できます。時間計算量は O(1) なので高速です。
以上がJava ループでの For アプリケーションと For-each アプリケーションの比較分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。