2

を使用してLinkedListを反復処理することを知っています

for(int i = 0; i < list.size(); i++){
  Item item = list.get(i);
}

.get(i)を呼び出すたびに、リストの先頭からiまでが繰り返されるため、単一のオブジェクトを取得するとパフォーマンスが低下します。

正しい方法は、イテレータを使用することです。ここまでは順調ですね。

しかし、このスタイルはどうですか?

for(Item item : list){
  // item is already here
}

これはイテレータを使用するのと同じパフォーマンスを持っていますか?これは内部でどのように機能しますか?

4

3 に答える 3

3

これはイテレータを使用するのと同じパフォーマンスを持っていますか?

はい。どちらのバリアントも同じバイトコードを生成します。次のバイトコードはfor-each-loopから生成されましたが、ループでイテレータを使用すると、まったく同じように見えます。

for(Object o : list) {
}

  44: aload_1
  45: invokevirtual #30                 // Method java/util/LinkedList.iterator:()Ljava/util/Iterator;
  48: astore_3
  49: goto          59
  52: aload_3
  53: invokeinterface #34,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
  58: astore_2
  59: aload_3
  60: invokeinterface #40,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
  65: ifne          52

これは内部でどのように機能しますか?

非配列の場合、for-each-loopは内部でイテレータを使用します。上記のバイトコードを参照してください。すべてのメソッドが呼び出され、イテレータを使用するときにも呼び出されます。

For-EachループおよびJavaの「foreach」ループはどのように機能しますか?も参照してください。いくつかの追加情報について。

于 2013-02-23T19:20:49.077 に答える
2

foreachループはインターフェースを使用しIterableます。呼び出しiterator()て、イテレータで繰り返します。配列には特別な処理が使用されます。

于 2013-02-23T19:20:49.717 に答える
0

size1つの違いは、各ループがリストのを変更したくない場合に使用されることです。リストの後にiteratorsなるものを使用するためです。通常のforループではそうではありませんが、毎回関数を呼び出すため、効率が低下します。両方のパフォーマンスを同じにするには、 10、15、..etcのような値を。の条件に置く必要があります。invalidateresizestandard loopsizefor eachconstantstandard loop

  • ForEach-読み取り専用モード

  • 標準-読み取りと書き込みの両方

質問に固有:最初からを呼び出すたびにリストをトラバースする必要があるため、forループの標準は実際には非効率的です。これはget、の呼び出しよりも問題があります。size

于 2013-02-23T19:23:21.073 に答える