Bu sorunun iki tipik nedeni vardır:
Statik Alanlar
Listenizdeki nesneler verileri statik alanlarda depoluyorsa, listenizdeki her nesne aynı değerleri taşıdıkları için aynı görünecektir. Aşağıdaki sınıfı düşünün:
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Bu örnekte, bildirildiği için int valuetüm örnekler arasında paylaşılan yalnızca bir tane var . ( "Sınıf Üyelerini Anlama" eğiticisine bakın.)Foostatic
FooAşağıdaki kodu kullanarak bir listeye birden çok nesne eklerseniz , her örnek 3bir çağrıdan şuna geri dönecektir getValue():
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
Çözüm basit - staticdeğerlerin gerçekten o sınıfın her örneği arasında paylaşılmasını istemiyorsanız, sınıfınızdaki alanlar için anahtar kelimeleri kullanmayın .
Aynı Nesneyi Eklemek
Bir listeye geçici bir değişken eklerseniz, her döngüde eklediğiniz nesnenin yeni bir örneğini oluşturmanız gerekir. Aşağıdaki hatalı kod pasajını düşünün:
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
Burada tmpnesne döngünün dışında oluşturulmuştur. Sonuç olarak, aynı nesne örneği listeye üç kez ekleniyor. Örnek değeri tutacaktır 2, çünkü son çağrı sırasında aktarılan değer buydu setValue().
Bunu düzeltmek için, nesne yapısını döngünün içine taşıyın:
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}