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 valueque se comparte entre todas las instancias de Fooporque está declarado static. (Consulte el tutorial "Comprensión de los miembros de la clase" ).
Si agrega varios Fooobjetos a una lista con el código siguiente, cada instancia volverá 3de una llamada a getValue():
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
La solución es simple: no use las staticpalabras 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 tmpobjeto 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);
}