# ArrayList<String> und ArrayList<String[]>



## hakoe (25. Jun 2008)

Hallo Freunde,

ich brauche dringd den Tritt, der mir auf die Sprünge hilft.
foldendes Problem:
Ein ArrayList<String>  zu befüllen funtioniert wie erwartet.
Ein ArrayList<String[]>  zu befüllen  klappt (bei mir) nicht!
So dachte ich,geht es:

```
ArrayList<String[]> liste=new ArrayList<String[]>();
    String[] zeile=new String[2];
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile[0]="Zeile"+(i+1);
        zeile[1]="Test"+(i+1);
        liste.add(zeile);
   }
```
Der Compiler frisst es, die Laufzeitumgebung frisst es.
Und wie ist das Ergebnis?
Alle (!!) Elemente der ArrayList enthalten die Daten des zuletzt ausgeführten liste.add(zeile).
W A R U M ?

Ratlose Grüsse
hakoe


----------



## tfa (25. Jun 2008)

Du hast nur ein "zeile"-Array. Das steht halt n mal in der Liste.


----------



## SlaterB (25. Jun 2008)

weil du mit
liste.add(zeile); 
ständig dasselbe Objekt einfügst,
nirgendwo zwischendurch kann man 'new String[]' lesen


----------



## Leroy42 (25. Jun 2008)

hakoe hat gesagt.:
			
		

> W A R U M ?



Ganz einfach weil du jedesmal dein Objekt _zeile_ wieder und wieder addest
und den Inhalt von _zeile_ jedesmal mit den neuesten Werten überschreibst.  :noe:


----------



## Leroy42 (25. Jun 2008)

Uuppss! Seid ihr schnell!  :shock:


----------



## hakoe (25. Jun 2008)

Danke für so schnelle Reaktionen.
Lasst mich mal nachdenken.
Ich melde mich dann nochmal.


----------



## Gast (25. Jun 2008)

So einfach sehe ich das aber nicht, denn wie gesagt:
    Mit einem einfachen String funktioniert es bei gleicher Formulierung wie  erwartet


```
ArrayList<String[]> liste=new ArrayList<String[]>();
    String zeile=new String;
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile="Zeile"+(i+1);
        liste.add(zeile);
   }
```

hakoe


----------



## SlaterB (25. Jun 2008)

weil du hier
zeile=irgendwas 
schreibst;

bei der Array-Variante ist aber nirgendwo
zeile=irgendwas 
zu lesen

vergleiche 
zeile_ = ..;
mit
liste.add()
oder 
liste.set()

nur weil du ein Element des Arrays (oder der Liste) bearbeitest,
wird deswegen doch nicht auf einmal ein neues Objekt erstellt,
zum Glück nicht.._


----------



## hakoe (25. Jun 2008)

Hallo SlaterB,
in der Array-Variante ist "zeile=irgendwas " zu lesen.
Und zwar zeile[0]= ...
                 zeile[1]=...
da zeile ein Array der Grösse 2 ist.
Wenn ich jetzt nach dem ersten Listing
3 Durchläufe mache (count=3), so wird zeile folgendermassen belegt:
1. Durchlauf:  zeile[0]="Zeile1" , zeile[1]="Test1"
2. Durchlauf:  zeile[0]="Zeile2" , zeile[1]="Test2"
3. Durchlauf:  zeile[0]="Zeile3" , zeile[1]="Test3"

hakoe


----------



## tfa (25. Jun 2008)

Aber du benutzt immer das selbe Array. Du brauchst für jeden Schleifendurchlauf ein neues.


----------



## hakoe (25. Jun 2008)

Hallo SlaterB, 
Das hat's gebracht:

zeile=new String[2]; 

am Ende des Schleifendurchlaufs.


```
ArrayList<String[]> liste=new ArrayList<String[]>();
    String[] zeile=new String[2];
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile[0]="Zeile"+(i+1);
        zeile[1]="Test"+(i+1);
        liste.add(zeile);
        zeile=new String[2];  //Das ist es
   }
```

Nochmals vielen Dank

hakoe


----------



## Saxony (25. Jun 2008)

Hiho,

is eigentlich ganz einfach:

Alle Elemente deiner Liste lässt du auf ein und dasselbe String[] Objekt zeigen!

Somit haben alle (Array)List Elemente den Inhalt des aktuellen String[] Objektes.


So würde es gehen:

```
ArrayList<String[]> liste=new ArrayList<String[]>(); 
		String[] zeile;
	    int i; 
	    int count=3; 
	    for (i=0;i<count;i++){ 
	        zeile = new String[2];
	    	zeile[0]="Zeile"+(i+1); 
	        zeile[1]="Test"+(i+1); 
	        liste.add(zeile);
	   }
```

Wenn du nur String nimmst, erzeugt ein zeile="Zeile" + (i+1) implizit eine neues String Objekt! Bei Verwendung eines String-Arrays musst du explizit new verwenden.

[edit]
Warst schneller! 
[/edit]

bye Saxony


----------



## hakoe (25. Jun 2008)

Ich habe wohl über die Art der Zuweisung und des Kopierens von Objecten
nicht genügend nachgedacht.
Die Sache ist dank Eurer Hilfe nun erledigt.

hakoe


----------

