ArrayList.get() liefert falsches Ergebnis

UweA

Mitglied
Hallo,

ich versuche eine dynamische Liste mit Hilfe von "ArrayList" zu erstellen:
Java:
public static class myClass extends Structure 
{
  public double myDouble;
}

public static List<myClass> myList = new ArrayList<myClass>();

...

myClass Test;
Test = new myClass();

for (i=0; i<3; i++)
{
  Test.myDouble = i;
  myList.add(Test);
}

Test.myDouble = -1.0;        
System.out.println("Size:" + myList.size());
for (i=0; i<3; i++)
{
  Test = myList.get(i);
  System.out.println(i + ". Test:" + Test.myDouble);
}

Die Ausgabe ist:

Size:3
0. Test:-1.0
1. Test:-1.0
2. Test:-1.0

Entweder ist bei ".add(Test)" was schief gegangen oder bei ".get(i)".
Kann mir jemand sagen, was ich hier falsch mache?

Gruß,
Uwe

P.S.: Das obige Beispiel ist auf das Problem reduziert. Meine eigentlich verwendete Struktur ist deutlich umfangreicher.
 
Ich sehe nichts, was da "schief gelaufen ist".
Du packst dreimal das selbe! Obejkt in die Liste, setzt anschließend setzt du den Wert eines fields dieses Objekts auf -1.0 und dann wird natürlich im Folgenden auch die -1.0 ausgegeben.

Was du vermutlich haben möchtest, sind verschiedene Objekte in der Liste. Die musst du dann aber auch erstellen und in die Liste packen statt immer das selbe Objekt zu verwenden.
 
Java:
public static class myClass extends Structure 
{
  public double myDouble;
}

public static List<myClass> myList = new ArrayList<myClass>();

...

myClass Test;
Test = new myClass();

for (i=0; i<3; i++)
{
  Test.myDouble = i;
  myList.add(Test);
}

Test.myDouble = -1.0;        
System.out.println("Size:" + myList.size());
for (i=0; i<3; i++)
{
  Test = myList.get(i);
  System.out.println(i + ". Test:" + Test.myDouble);
}


Entweder ist bei ".add(Test)" was schief gegangen oder bei ".get(i)".
Kann mir jemand sagen, was ich hier falsch mache?

Dein Problem ist das du nur ein Objekt der Klasse "myClass" erstellst (Klassennamen werden übrigens immer UpperCamelCase geschrieben).
Diese Objekt fügst du nun X mal zu deiner Liste hinzu. Danach änderst du den Wert "myDouble" von deinem EINEM(!) Objekt auf -1.0.

Fehlerbehebung: Erstelle immer ein neues Objekt der Klasse "myClass" und füge dieses zur Liste hinzu.
 
Ok, verstanden.
Ich ging davon aus, dass das "Add()" eine Kopie des Objektes anlegt.
Letztendlich werden aber wohl nur pointer verwaltet.
Mit folgender Änderung geht es jetzt:
Java:
for (i=0; i<3; i++)
{
  Test = new myClass();
  Test.myDouble = i;
  myList.add(Test);
}

Vielen Dank für die Hilfe,
Uwe
 
Ich ging davon aus, dass das "Add()" eine Kopie des Objektes anlegt.

Achtung: Nie von etwas einfach ausgehen 😉
Immer den entsprechenden Code anschauen bzw. die Dokumentation lesen was die Methode wirklich macht wenn man es nicht weiß.

Normalerweise sollte der Methodenname meist selbstsprechend sein. Würde die Methode eine Kopie speichern wäre "addCopy" wahrscheinlich der passendere Name gewesen.
 

Zurück
Oben