Erweitertes for
Erweitertes for für Arrays Der Durchlauf der Elemente eines Feldes mit Index sieht üblicherweise so aus; for (  int  i = 0; i < array.length; i++ ) {   int  e = array[ i ];   System.out.println( e ); } Die neue  erweiterte for-Schleife  (auch  foreach  genannt) ermöglicht ein Durchlaufen ohne sichtbaren Index: for (  int  e : array )  {   System.out.println( e ); }
Erweitertes for für Collections Die for-Schleife zum Iterieren über Elemente einer  java.util.Collection  sieht im allgemeinen so aus: for ( Iterator i = list.iterator(); i.hasNext(); ) {   Object o = i.next();   ... } Kürzer geht das mit dem erweiterten for: for ( Object o : list ) {   ... }
Grenzen vom erweiterten for Auf die Elemente – sei es Feldelemente oder Elemente der  Collection  – kann nur lesend, aber nicht schreibend zugegriffen werden. Bei einer Iteration beginnt es immer am Anfang und endet hinten. Man kann keinen Offset definieren. Man kann nicht rückwärts von hinten nach vorne laufen. Elemente lassen sich nicht überspringen. Mit einem Index lassen sich nicht gleichzeitig zwei Datenstrukturen durchlaufen. Ein normales  break  ist möglich und beendet die Schleife!
Die Schnittstelle Iterable  Rechts vom Doppelpunkt des erweiteren for steht ein Objekt vom Typ  java.lang.Iterable : package java.lang.Iterable; public interface Iterable<T> {   public java.util.Iterator<T> iterator(); } Die Schnittstelle  java.util.Collection  erweitert  Iterable . So können alle Datenstrukturen (außer  Map ) rechts vom Doppelpunkt beim erweiterten for stehen. List list = new ArrayList(); for ( Object o : list )   ... Map  und String implementieren  Iterable  nicht!
Generische Deklaration und for Eine nicht mit Java 5 Generics deklarierte Liste kann nur mit dem Typ  Object  durchlaufen werden. List list = new ArrayList(); for ( Object o : list )   ... Ist die Liste typisiert, kann der Typ spezialisiert sein: List <String>  list = new ArrayList <String> (); for (  String  o : list )   ...
Performance-Probleme? Das erweiterte for soll eine  List<String> l  ablaufen: for ( String s : list )   System.out.println( s ); Hieraus geniert der (Sun)-Compiler Programmcode, der über einen  Iterator  die Datenstruktur abläuft. String s; for (Iterator i$ = list.iterator(); i$.hasNext();)   System.out.println( (String) i$.next() ); Im Fall einer  LinkedList  ist das Ablaufen mit einem  Iterator  am effizientesten, aber bei einer  ArrayList  ist  get(index)  etwas schneller. Wenn es auf absolute Performanz ankommt, sollte der Zugriff besser klassisch über  get()  erfolgen.
Durchlauf Das erweiterte for läuft die Collection über einen Standard-Iterator ab. Da ein Iterator parallele Änderungen überwacht, darf keiner im Hintergrund die Datenstruktur ändern. Das nennt sich fail-fast. Das Verhalten ist zum Beispiel bei der Klasse  ArrayList  dokumentiert. Sonst gibt es eine Exception.

Erweiteres for (foreach) in Java 5

  • 1.
  • 2.
    Erweitertes for fürArrays Der Durchlauf der Elemente eines Feldes mit Index sieht üblicherweise so aus; for ( int i = 0; i < array.length; i++ ) { int e = array[ i ]; System.out.println( e ); } Die neue erweiterte for-Schleife (auch foreach genannt) ermöglicht ein Durchlaufen ohne sichtbaren Index: for ( int e : array ) { System.out.println( e ); }
  • 3.
    Erweitertes for fürCollections Die for-Schleife zum Iterieren über Elemente einer java.util.Collection sieht im allgemeinen so aus: for ( Iterator i = list.iterator(); i.hasNext(); ) { Object o = i.next(); ... } Kürzer geht das mit dem erweiterten for: for ( Object o : list ) { ... }
  • 4.
    Grenzen vom erweitertenfor Auf die Elemente – sei es Feldelemente oder Elemente der Collection – kann nur lesend, aber nicht schreibend zugegriffen werden. Bei einer Iteration beginnt es immer am Anfang und endet hinten. Man kann keinen Offset definieren. Man kann nicht rückwärts von hinten nach vorne laufen. Elemente lassen sich nicht überspringen. Mit einem Index lassen sich nicht gleichzeitig zwei Datenstrukturen durchlaufen. Ein normales break ist möglich und beendet die Schleife!
  • 5.
    Die Schnittstelle Iterable Rechts vom Doppelpunkt des erweiteren for steht ein Objekt vom Typ java.lang.Iterable : package java.lang.Iterable; public interface Iterable<T> { public java.util.Iterator<T> iterator(); } Die Schnittstelle java.util.Collection erweitert Iterable . So können alle Datenstrukturen (außer Map ) rechts vom Doppelpunkt beim erweiterten for stehen. List list = new ArrayList(); for ( Object o : list ) ... Map und String implementieren Iterable nicht!
  • 6.
    Generische Deklaration undfor Eine nicht mit Java 5 Generics deklarierte Liste kann nur mit dem Typ Object durchlaufen werden. List list = new ArrayList(); for ( Object o : list ) ... Ist die Liste typisiert, kann der Typ spezialisiert sein: List <String> list = new ArrayList <String> (); for ( String o : list ) ...
  • 7.
    Performance-Probleme? Das erweitertefor soll eine List<String> l ablaufen: for ( String s : list ) System.out.println( s ); Hieraus geniert der (Sun)-Compiler Programmcode, der über einen Iterator die Datenstruktur abläuft. String s; for (Iterator i$ = list.iterator(); i$.hasNext();) System.out.println( (String) i$.next() ); Im Fall einer LinkedList ist das Ablaufen mit einem Iterator am effizientesten, aber bei einer ArrayList ist get(index) etwas schneller. Wenn es auf absolute Performanz ankommt, sollte der Zugriff besser klassisch über get() erfolgen.
  • 8.
    Durchlauf Das erweitertefor läuft die Collection über einen Standard-Iterator ab. Da ein Iterator parallele Änderungen überwacht, darf keiner im Hintergrund die Datenstruktur ändern. Das nennt sich fail-fast. Das Verhalten ist zum Beispiel bei der Klasse ArrayList dokumentiert. Sonst gibt es eine Exception.

Hinweis der Redaktion