Este problema tiene dos causas típicas:
Campos estáticos
Si los objetos en su lista almacenan datos en campos estáticos, cada objeto en su lista parecerá ser el mismo porque tienen los mismos valores. Considere la clase a continuación:
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
En ese ejemplo, solo hay uno int value
que se comparte entre todas las instancias de Foo
porque está declarado static
. (Consulte el tutorial "Comprensión de los miembros de la clase" ).
Si agrega varios Foo
objetos a una lista con el código siguiente, cada instancia volverá 3
de una llamada a getValue()
:
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
La solución es simple: no use las static
palabras clave para los campos de su clase a menos que realmente desee que los valores se compartan entre cada instancia de esa clase.
Agregar el mismo objeto
Si agrega una variable temporal a una lista, debe crear una nueva instancia del objeto que está agregando, cada vez que realice un bucle. Considere el siguiente fragmento de código erróneo:
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
Aquí, el tmp
objeto se construyó fuera del bucle. Como resultado, la misma instancia de objeto se agrega a la lista tres veces. La instancia mantendrá el valor 2
, porque ese fue el valor pasado durante la última llamada a setValue()
.
Para solucionar esto, simplemente mueva la construcción del objeto dentro del ciclo:
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}