web-dev-qa-db-ja.com

Java:コレクション(ここではArrayList)を反復処理する最良の方法

今日、すでに何百回も使用しているコードに到達したとき、私は喜んでコーディングしていました。

コレクション(ここではArrayList)を反復処理する

何らかの理由で、Eclipseのオートコンプリートオプションを実際に見て、不思議に思いました。

次のループは他のループよりも使用した方がよい場合は何ですか?

古典的な配列インデックスループ:

for (int i = 0; i < collection.length; i++) {
  type array_element = collection.get(index);
}

イテレーターにはnext()/ next()があります:

for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
  type type = (type) iterator.next();   
}

そして、私のお気に入りは、書くのがとても簡単だからです:

for (iterable_type iterable_element : collection) {

}
91
Jason Rogers

最初のものは、要素のインデックスも必要な場合に便利です。これは基本的にArrayListsの他の2つのバリアントと同等ですが、LinkedListを使用すると本当に遅くなります。

2番目は、要素のインデックスは必要ないが、繰り返しながら要素を削除する必要がある場合に役立ちます。しかし、これには少し冗長すぎるIMOであるという欠点があります。

3番目のバージョンも私の好みの選択肢です。これは短く、インデックスや基礎となるイテレータを必要としないすべての場合に機能します(つまり、要素にアクセスするだけで、要素を削除したり、Collectionを変更したりすることはありません-最も一般的なケースです)。

98
MAK

それらはすべて独自の用途があります:

  1. イテレート可能オブジェクトがあり、それらすべてを無条件にトラバースする必要がある場合:

    for(iterable_type iterable_element:collection)

  2. 反復可能だが条件付きでトラバースする必要がある場合:

    for(Iterator iterator = collection.iterator(); iterator.hasNext();)

  3. データ構造が反復可能を実装しない場合:

    for(int i = 0; i <collection.length; i ++)

35
Suraj Chandran

Java 8のコレクションの追加のstream()utilがあります

collection.forEach((temp) -> {
            System.out.println(temp);
});

または

collection.forEach(System.out::println);

Java 8ストリームと不思議な人のためのコレクションの詳細 link

11
snr

それらのどれも他のものよりも「良い」ものではありません。 3番目は、私にとっては読みやすいですが、foreachを使用しない人にとっては奇妙に見えるかもしれません(最初の方を好むかもしれません)。 Javaを理解している人なら誰でも3つすべてがはっきりしているので、コードについて気分が良くなる方を選んでください。

最初のパターンは最も基本的なものであるため、最も普遍的なパターンです(配列で機能し、考えられるすべての反復可能要素)。それが私が考えることができる唯一の違いです。より複雑な場合(たとえば、現在のインデックスにアクセスする必要がある場合、またはリストをフィルターする必要がある場合)、最初のケースと2番目のケースの方がそれぞれ意味があります。単純な場合(反復可能なオブジェクト、特別な要件はありません)、3番目が最もクリーンなようです。

4
Rafe Kettler

最初のオプションは、パフォーマンスが優れています(ArrayListがRandomAccessインターフェイスを実装するため)。 Java docによると、クラスの典型的なインスタンスで次のループが発生する場合、List実装はRandomAccessインターフェイスを実装する必要があります。

 for (int i=0, n=list.size(); i < n; i++)
     list.get(i);

このループよりも高速に実行されます。

 for (Iterator i=list.iterator(); i.hasNext(); )
     i.next();

役に立てば幸いです。順次アクセスリストの場合、最初のオプションは遅くなります。

2
Amitav Padhi

ここに例があります

Query query = em.createQuery("from Student");
             Java.util.List list = query.getResultList();
             for (int i = 0; i < list.size(); i++) 
             {

                 student = (Student) list.get(i);
                 System.out.println(student.id  + "  " + student.age + " " + student.name + " " + student.prenom);

             }
1
Abdelouhab