Erweiteres for (foreach) in Java 5

8,356 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,356
On SlideShare
0
From Embeds
0
Number of Embeds
551
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • #toc2
  • Erweiteres for (foreach) in Java 5

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

    ×