今日、すでに何百回も使用しているコードに到達したとき、私は喜んでコーディングしていました。
コレクション(ここでは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) {
}
最初のものは、要素のインデックスも必要な場合に便利です。これは基本的にArrayList
sの他の2つのバリアントと同等ですが、LinkedList
を使用すると本当に遅くなります。
2番目は、要素のインデックスは必要ないが、繰り返しながら要素を削除する必要がある場合に役立ちます。しかし、これには少し冗長すぎるIMOであるという欠点があります。
3番目のバージョンも私の好みの選択肢です。これは短く、インデックスや基礎となるイテレータを必要としないすべての場合に機能します(つまり、要素にアクセスするだけで、要素を削除したり、Collection
を変更したりすることはありません-最も一般的なケースです)。
それらはすべて独自の用途があります:
イテレート可能オブジェクトがあり、それらすべてを無条件にトラバースする必要がある場合:
for(iterable_type iterable_element:collection)
反復可能だが条件付きでトラバースする必要がある場合:
for(Iterator iterator = collection.iterator(); iterator.hasNext();)
データ構造が反復可能を実装しない場合:
for(int i = 0; i <collection.length; i ++)
Java 8のコレクションの追加のstream()utilがあります
collection.forEach((temp) -> {
System.out.println(temp);
});
または
collection.forEach(System.out::println);
Java 8ストリームと不思議な人のためのコレクションの詳細 link
それらのどれも他のものよりも「良い」ものではありません。 3番目は、私にとっては読みやすいですが、foreachを使用しない人にとっては奇妙に見えるかもしれません(最初の方を好むかもしれません)。 Javaを理解している人なら誰でも3つすべてがはっきりしているので、コードについて気分が良くなる方を選んでください。
最初のパターンは最も基本的なものであるため、最も普遍的なパターンです(配列で機能し、考えられるすべての反復可能要素)。それが私が考えることができる唯一の違いです。より複雑な場合(たとえば、現在のインデックスにアクセスする必要がある場合、またはリストをフィルターする必要がある場合)、最初のケースと2番目のケースの方がそれぞれ意味があります。単純な場合(反復可能なオブジェクト、特別な要件はありません)、3番目が最もクリーンなようです。
最初のオプションは、パフォーマンスが優れています(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();
役に立てば幸いです。順次アクセスリストの場合、最初のオプションは遅くなります。
ここに例があります
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);
}