ホームページ > Java > &#&チュートリアル > For-Each ループとイテレータ: コレクションの走査にはどちらが効率的ですか?

For-Each ループとイテレータ: コレクションの走査にはどちらが効率的ですか?

DDD
リリース: 2024-11-17 11:54:02
オリジナル
478 人が閲覧しました

For-Each Loop vs. Iterator: Which is More Efficient for Traversing Collections?

効率の決定: For-Each ループとイテレータ

コレクションを効率的に走査する際に、どのアプローチが優れているのかという疑問が生じます。 for-each ループまたはiterator?

従来の For ループ

一般に「C スタイル」ループと呼ばれる従来の for ループは、次の構文を例にします:

for(int i=0; i<list.size(); i++) {
   Object o = list.get(i);
}
ログイン後にコピー

それぞれについてLoop

Java 5 では、ループ処理を効率化する拡張された for-each ループ構文が導入されました。

for (Integer integer : a) {
  integer.toString();
}
ログイン後にコピー

Iterator

Javaイテレータの抽象化は、 collection:

for (Iterator iterator = a.iterator(); iterator.hasNext();) {
   Integer integer = (Integer) iterator.next();
   integer.toString();
}
ログイン後にコピー

パフォーマンスの違い

コレクションから値を変更せずに読み取るだけの場合、for-each ループとイテレータのどちらを選択してもパフォーマンスは大きく変わりません。違い。どちらのアプローチも内部的にイテレータを利用します。

ただし、特定のデータ構造を走査する場合、従来の for ループは for-each ループやイテレータよりも効率が劣る可能性があります。たとえば、リンク リストでは、get(i) を使用して要素を取得するために O(n) 操作が必要です。これにより、ループの複雑さは O(n2) になります。イテレーターは進行するための O(1) 操作を保証し、ループの複雑さは O(n) になります。

バイトコードの比較

両方のループから生成されたバイトコードの比較型はそれらの同等性を示しています:

For-Each Loopバイトコード:

ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
ログイン後にコピー

反復子バイトコード:

ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
ログイン後にコピー

結論

for-each 以来ループとイテレータは効率の点では本質的に同じように動作しますが、多くの場合、それは好みの問題です。ほとんどのシナリオでは、その簡潔さのため、見た目の美しさから for-each ループが好まれます。

以上がFor-Each ループとイテレータ: コレクションの走査にはどちらが効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート