For-Each Loop

Status
Nicht offen für weitere Antworten.

sousou

Bekanntes Mitglied
Hallo,


hab ein wenig schwieriegkeiten bei der For-Each Loop also der for each Schleife. Und zwar Weiß ich wiedie normale For-Schleife funktioniert.. die for each versteh ich jedoch nicht.....

Beispiel:

Normale forschleife:
[JAVA=42]
String [] wochentage = { "montag", "dienstag", mittwoch", "freitag", "samstag", "sonntag" };

for(int i = 0; i < 10; i++) {
System.out.println(i.+"Wochentag:"+wochentage);
}
[/code]

Wie könnte ich jetzt eine normale for each Schleife machen, die den selben effekt bringt wie diese normale For - Schleife.



Danke im voraus:)
 

0x7F800000

Top Contributor
Dein code enthält mindestens 2 Syntaxfehler...

Wenn du den laufindex benötigst, taugt die foreach-schleife nichts. Bei einer Foreach schleife kannst du auf den Index nicht mehr zugreifen. Aber da dieser meistens eh nur rumnervt, oder gar nicht vorhanden ist, benutzt man oft eben die viel kürzere foreach-schleife.
 

Painii

Bekanntes Mitglied
Java:
for(int i = 0; i < 10; i++) { 
 System.out.println(i.+"Wochentag:"+wochentage[i]);
}
//gleich wie
int i =0;
for(String wochentag:wochentage){
 System.out.println((++i) +". Wochentag: "+wochentag);
}

In der for-each-schleife wird also immer noch eine extra-variable benutzt aus dem array/collection.
Die "normale" for-schleife kann auch leer sein, also keine extra hilfs-variablen haben, oder auch mehr als eine haben.

edit: ja, ein e vergessen, wollte doch schnell noch den beitrag schreiben vorm essen ;)
 
Zuletzt bearbeitet:
C

C_A

Gast
Ich habe mal eine Frage: in den meisten Lehrbüchern, aber auch in zahlreichen Beispielen im Internet wird mit for-Schleifen über Arrays iteriert, obwohl der Index gar nicht benötigt wird. Ich hätte in vielen Beispielen eine for-each-Schleife erwartet.

Gibt es Gründe gegen eine for-each-Schleife? Gibt es Nachteile gegenüber der for-Schleife?
 

eRaaaa

Top Contributor
oder das Buch aus der Zeit vor Java 5 stammt :) (oder man den Index zwar nicht braucht, aber man vllt nur jedes zweite Element lesen möchte i+=2 ..oder Allgemein..nicht alle :D)
 
C

C_A

Gast
:D

Na gut, ist mir nur aufgefallen. Manchmal habe ich einfach den Eindruck, dass for-each-Schleifen irgendwas eklig an sich haben müssen. sozusagen die Schmuddelkinder der Programmierer-Werkzeuge.
 

Ziegenpeter

Aktives Mitglied
Nur nochmal allgemein, da es so noch nirgendwo steht:

Java:
for(Typ variable : collection){
...
}
wobei Typ der Typ der Elemente in deiner Collection ist, variable ist ein von dir gewählter Variablenname und collection ist Name deiner Collection über die iteriert werden soll. Mit jedem Schleifendurchlauf steht in 'variable' dann ein Eintrag aus deiner Collection.
 

eRaaaa

Top Contributor
:D

Na gut, ist mir nur aufgefallen. Manchmal habe ich einfach den Eindruck, dass for-each-Schleifen irgendwas eklig an sich haben müssen. sozusagen die Schmuddelkinder der Programmierer-Werkzeuge.

Nein im Gegenteil! Sun *hust* empfiehlt sogar man solle am Besten immer for-each nehmen, sofern man dies auch ohne Probleme tun kann.
Manchmal braucht man aber auch den Iterator (an den man so ja nicht ran kommt/sieht) , dann kann man for-each halt auch nicht benutzen...:cool:
 

Landei

Top Contributor
In unserem alten Code stehen fast überall Iteratoren drin, und in 95% der Fälle lassen die sich durch for-each loops ersetzen (was ich meistens auch tue).

Kurz gesagt: for-each ist besser als for ist besser als while und/oder Iterator.
- for-each ist besser als for, weil man sich mit dem Index nicht vermachen kann.
- die beiden for-Varianten sind besser als while oder do, weil die Schleifenvariable oder der Iterator nicht im umgebenden Block sichtbar ist, was zu subtilen Fehlern führen kann:

Java:
Iterator it1 = myBlaList.itererator();
while(it1.hasNext()) {
   Bla bla = (Bla)it1;
   doSomething(bla);
}
...
Iterator it2 = myOtherBlaList.itererator();
while(it1.hasNext()) {
   Bla bla = (Bla)it1;
   doSomethingElse(bla);
}
Tatsächlich sind mir solche Fehler schon öfter untergekommen.
 

faetzminator

Gesperrter Benutzer
Leider finde ich die Aussage gerade nirgends, aber man sollte AFAIK auf foreachs mit Arrays verzichten (man sollte allgemein auf Arrays verzichten ;) ), da intern diese zuerst in ein Iterable Object umgewandelt werden. Kann jemand meine Aussage bestätigen?
 

eRaaaa

Top Contributor
Mhm, also laut Java Blog Buch : 06.08 Iterable, for-each und Iterator wird daraus eher eine normale for. Hab`s eben auch mal decompiliert, da sah`s genau so aus. Auch die Insel sagt:
http://openbook.galileocomputing.de/javainsel8/javainsel_03_010.htm#mj0cca794d575714a3dbff8db667e0ab85 hat gesagt.:
Intern setzt der Compiler diese erweiterte for-Schleife ganz klassisch um, sodass der Bytecode unter beiden Varianten gleich ist.

??
 

faetzminator

Gesperrter Benutzer
Oke, dann lag mir da wohl eine Fehlinformation vor oder mein Gedächnis spielt mir einen Streich. Trotzdem ändert dies nichts an meiner Aussage, dass Arrays irgendwie nicht unbedingt ins OO-Konzept passen - aber dies ist eine andere Diskussion ;) .
 

ThreadPool

Bekanntes Mitglied
Mhm, also laut Java Blog Buch : 06.08 Iterable, for-each und Iterator wird daraus eher eine normale for. Hab`s eben auch mal decompiliert, da sah`s genau so aus. Auch die Insel sagt:

??

Was da rauskommt ist JVM spezifisch, die JLS referiert unter Punkt 14.14.2 nur über die "inhaltliche
Bedeutung". Bytecode-mäßig (bei mir 32Bit JVM, Win XP Ver. 1.6_01) braucht test2() fünf Operationen
mehr wobei das hauptsächlich ein paar zusätzliche Variablen sind. Kompiliert wurde mit -g:none -
target 1.6
. Zum Anzeigen des Bytecodes habe ich javap -c verwendet

Java:
    int a[]={1,2,3};
	int b[]={4,5,6};
	public void test1(){
		for(int i = 0; i < a.length; i++){
			System.out.println(a[i]);
		}
	}

	public void test2(){
		for(int i:b){
			System.out.println(i);
		}
	}

Nur die nackten for's.
Java:
    int a[]={1,2,3};
	int b[]={4,5,6};
	public void test1(){
		for(int i = 0; i < a.length; i++){
		}
	}

	public void test2(){
		for(int i:b){
		}
	}

Und der Bytecode dazu.

Code:
public void test1();
  Code:
   0:	iconst_0
   1:	istore_1
   2:	iload_1
   3:	aload_0
   4:	getfield	#2; //Field a:[I
   7:	arraylength
   8:	if_icmpge	17
   11:	iinc	1, 1
   14:	goto	2
   17:	return

public void test2();
  Code:
   0:	aload_0
   1:	getfield	#3; //Field b:[I
   4:	astore_1
   5:	aload_1
   6:	arraylength
   7:	istore_2
   8:	iconst_0
   9:	istore_3
   10:	iload_3
   11:	iload_2
   12:	if_icmpge	26
   15:	aload_1
   16:	iload_3
   17:	iaload
   18:	istore	4
   20:	iinc	3, 1
   23:	goto	10
   26:	return

Und nur FYI, das Kürzeste was man so hinbekommt ist IMHO wenn das Array von hinten
abgearbeitet wird. Dann kann man noch eine Operation sparen zum inkrementierenden
for.

Java:
	public void test4(){
		for(int i = a.length; --i >=0;){
		}
	}

Code:
public void test4();
  Code:
   0:	aload_0
   1:	getfield	#2; //Field a:[I
   4:	arraylength
   5:	istore_1
   6:	iinc	1, -1
   9:	iload_1
   10:	iflt	16
   13:	goto	6
   16:	return
 
Zuletzt bearbeitet:

Antoras

Top Contributor
Wobei man sich hier natürlich die Frage stellen muss wie viel nativer Code von den Schleifen übrig bleib. Ich schätze mal, dass de Java-Compiler im Vergleich zu z.B. einem C-Compiler relative wenig optimieren kann, da ja die Plattformunabhängigkeit gewährt bleiben muss. Erst der Java-Interpreter bzw. die JVM dürften mit dem Optimieren richtig loslegen.
Von dem her würde ich mir da gar keine Gedanken machen welche for-Schleife man da am besten einsetzen soll.
 

ThreadPool

Bekanntes Mitglied
Von dem her würde ich mir da gar keine Gedanken machen welche for-Schleife man da am besten einsetzen soll.

Bei dem enhanced for sollte man zumindest nachsehen wie der Iterator des Ziels implementiert ist. Mir
sind schon Iteratoren untergekommen bei deren Erstellung noch so einiges getan wurde und die Kosten
dementsprechend hoch waren. Es wurde jedoch übersehen das der "teure" Iterator nicht für alle
Operationen benötigt wurde, was im Endeffekt 3% Geschwindigkeitsunterschied ausgemacht hat. Das
ist nicht übermäßig wird da manch einer sagen, der Meinung bin ich auch. Ich möchte nur darauf
hinweisen das man in der freien Wildbahn die Augen offen halten sollte. Und natürlich gilt wie auch in
meinem Beispiel First make it right. Then make it fast.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A For each loop Java Basics - Anfänger-Themen 3
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
N methodenaufruf for each geht nicht Java Basics - Anfänger-Themen 2
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
T Methode um Array mit for-each-Schleife auszulesen Java Basics - Anfänger-Themen 7
Z Boolean Abfrage in einer for each Schleife Java Basics - Anfänger-Themen 2
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
K Array mit for-each Schleife füllen Java Basics - Anfänger-Themen 5
G For-Each und Modifikation eines Arrays Java Basics - Anfänger-Themen 9
K For Each Schleife wieder von Beginn an iterieren Java Basics - Anfänger-Themen 12
F for each Java Basics - Anfänger-Themen 3
T For each schleife Java Basics - Anfänger-Themen 4
G PrintWriter each line möglich? Java Basics - Anfänger-Themen 4
T String und for-each Schleife Java Basics - Anfänger-Themen 5
P for each schleife Java Basics - Anfänger-Themen 4
L for each schleife und löschen von elementen Java Basics - Anfänger-Themen 8
C Frage zur For-Each-Schleife Java Basics - Anfänger-Themen 6
M for each-Schleife Java Basics - Anfänger-Themen 13
E for each Schleife Java Basics - Anfänger-Themen 13
G for-each schleife Java Basics - Anfänger-Themen 3
J For-Each-Schleife abwechselnd auslesen Java Basics - Anfänger-Themen 3
G mit for each über Map iterieren :bahnhof: Java Basics - Anfänger-Themen 3
M String mit For Each durchlaufen Java Basics - Anfänger-Themen 4
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
I Scanner Loop Java Basics - Anfänger-Themen 1
J Erste Schritte Unendlichen Loop stoppen Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
L loop für Namen Java Basics - Anfänger-Themen 11
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
iman Loop Java Basics - Anfänger-Themen 21
CT9288 Permanent laufender loop mit Eingabefunktion gesucht Java Basics - Anfänger-Themen 1
P for-loop Java Basics - Anfänger-Themen 10
B Verwirrender Game Loop Java Basics - Anfänger-Themen 6
W While-Loop unterbrechen Java Basics - Anfänger-Themen 4
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
D Was ist Loop: ? Java Basics - Anfänger-Themen 13
Zeekay Development Erste Schritte Spitzen via For-Loop Java Basics - Anfänger-Themen 4
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
M bufferedreader loop stoppen Java Basics - Anfänger-Themen 2
R window-Klasse, main-loop und unausschaltbares anti-aliasing Java Basics - Anfänger-Themen 0
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
E Integer oder Strings spiegeln (in while loop) Java Basics - Anfänger-Themen 6
G Game Loop Problem Java Basics - Anfänger-Themen 9
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
D Loop Funktion für Robot Klasse Java Basics - Anfänger-Themen 5
Devil0s while loop, Button action Java Basics - Anfänger-Themen 8
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
L Mit ChangeListener JSpinner Loop erstellen Java Basics - Anfänger-Themen 2
N Problem mit Loop Java Basics - Anfänger-Themen 2
A Vectors in for-loop Java Basics - Anfänger-Themen 6
G Loop blockt alle Events Java Basics - Anfänger-Themen 7
G Loop funktion Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben