Dieses Problem hat zwei typische Ursachen:
Statische Felder, die von den Objekten verwendet werden, die Sie in der Liste gespeichert haben
Versehentlich dasselbe Objekt zur Liste hinzufügen
Statische Felder
Wenn die Objekte in Ihrer Liste Daten in statischen Feldern speichern, scheint jedes Objekt in Ihrer Liste dasselbe zu sein, da sie dieselben Werte enthalten. Betrachten Sie die folgende Klasse:
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
In diesem Beispiel gibt es nur eine, int value
die von allen Instanzen gemeinsam genutzt wird, Foo
weil sie deklariert ist static
. (Siehe Tutorial "Grundlegendes zu Klassenmitgliedern" .)
Wenn Sie Foo
einer Liste mit dem folgenden Code mehrere Objekte hinzufügen , kehrt jede Instanz 3
von einem Aufruf an Folgendes zurück getValue()
:
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
Die Lösung ist einfach: Verwenden Sie die static
Schlüsselwörter nicht für Felder in Ihrer Klasse, es sei denn, Sie möchten tatsächlich, dass die Werte von jeder Instanz dieser Klasse gemeinsam genutzt werden.
Hinzufügen des gleichen Objekts
Wenn Sie einer Liste eine temporäre Variable hinzufügen, müssen Sie bei jeder Schleife eine neue Instanz des hinzuzufügenden Objekts erstellen. Betrachten Sie das folgende fehlerhafte Code-Snippet:
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
Hier wurde das tmp
Objekt außerhalb der Schleife konstruiert. Infolgedessen wird dieselbe Objektinstanz dreimal zur Liste hinzugefügt. Die Instanz enthält den Wert 2
, da dies der Wert war, der beim letzten Aufruf von übergeben wurde setValue()
.
Um dies zu beheben, verschieben Sie einfach die Objektkonstruktion innerhalb der Schleife:
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}