# Problem mit vereinfachter For-Schleife



## AQWS6p (24. Mrz 2010)

Hallo!

Ich habe ein Problem mit der vereinfachten Variante der For-Schleife (foreach heißt die glaub ich). Die kann man ja eigentlich prima verwendenn, um mit Arrays zu arbeiten.. will ich jedoch in das Array schreiben, so geht das nicht. 
Hier mal etwas Code, erst das normale for, was funktioniert, und dann foreach.


```
int[] test = new int[] {1, 2, 3, 4};

for(int i = 0; i < test.length; i++) {
	test[i] *= 2; //funktioniert wie erwartet
}

for(int item : test) {
	item *= 2; // Erbringt keine tatsächliche Änderung
}
```

worran liegt das, und gibt es eine Möglichkeit, auch mit foreach zu schreiben?

Danke!


----------



## Schandro (24. Mrz 2010)

bei der foreach-Schleife wird der Wert des aktuellen Elementes in eine andere Variable gespeichert. In deinem Fall heisst diese "item". Deswegen ändert es nix am Array, wenn du den Wert dieser Variable änderst.
=> Du musst die normale for-Scheife benutzen...


----------



## xgENRz (24. Mrz 2010)

Danke dir, das klingt einleuchtend.

Heißt das, man kan mit foreach generell nur "readonly" betreiben?
Oder gilt das nur für Arrays, und bei anderen Typen (z.B. Listen) geht es doch irgendwie?


----------



## Murray (24. Mrz 2010)

Diese Code

```
for(int item : test) {
    item *= 2; 
}
```

ist eigentlich äquivalent zu

```
for(int i = 0; i < test.length; i++) {
    int item = test[i];
    item *= 2; 
}
```
In beiden Fällen ist item ein int, der den Wert des aktuellen Array-Elements enhält, aber nicht etwa ein Synonym für das jeweilige Array-Element. Daher hat eine neue Zuweisung an item keine Auswirkung auf das Array,
Ähnlich wie hier

```
int a = 1;
int b= a;
b = 2; //--- jetzt ist a natürlich immer noch 1
```

Zum Schreiben brauchst du den Index. Den könnte man zwar auch in einer foreach-Schleife mitführen, aber dann ist m.E. die klassische for-Schleife meistens besser.


----------



## Schandro (24. Mrz 2010)

Mit ner foreach-Schleife kannst du die Referenzen die in der Liste/Collection/Array/... drinstecken nicht ändern, ja. Wenn du aber den Zustand des referenzierten Objektes änderst, betrifft das natürlich auch die Liste/Collection/Array/...  (ist bei primitiven Datentypen natürlich ausgeschlossen..)


----------



## SlaterB (24. Mrz 2010)

siehe auch
http://www.java-forum.org/java-basics-anfaenger-themen/97072-foreach-java-eher-unbrauchbar.html


----------

