2016-04-12 14 views
-1

Java için 2 yıl boyunca yazdığım zamanlarda bile, bugün tuhaf davranışları farkettim.Java bağlantılı listedeki otomatik olarak nesne değerini değiştirmeyi devre dışı bırak

in list lim: abc 3 
in list lid: abc 3 

Ve evet, aynı nesneyi şu farklı listesine eklenir: İşte

public static void main() { 
    Lorem lo = new Lorem("abc", 2);   
    LinkedList<Lorem> lim = new LinkedList<>();   
    lim.add(lo); 
    LinkedList<Lorem> lid = new LinkedList<>();   
    lo.tf++;   
    lid.add(lo); 

    System.out.println("in list lim: " + lim.get(0).term + " " + lim.get(0).tf);   
    System.out.println("in list lid: " + lid.get(0).term + " " + lid.get(0).tf); 
    } 

    class Lorem { 
    public String term; 
    public int tf; 

    public Lorem(String term, int tf) { 
     this.term = term; 
     this.tf = tf; 
    } 
    } 

sonuç böyledir, benim kod bir göz atın. Bir liste kayıt nesnesi, durum "term =" abc ", tf = 2. olduğunda ve diğeri ise" abc "ve tf = 3 olduğunda kaydedilir. Ve sonunda, her bir listenin değerini yazdırdığımı görebilirsiniz. . Şaşırtıcı bir şekilde, limitte nesne lo, kapakta lo ile aynı değere sahiptir. Onları senkronize etmediğimde bile. Sorum şu: Neden Java bu tür diğer listeyi otomatik olarak güncelliyor (senkronize ediyor)? Bu davranış nasıl devre dışı bırakılır?

+0

Evet, değiştirilebilir nesneler buna benzer. – dasblinkenlight

cevap

1

Bu şaşırtıcı değil ve 2 yıldır programlamayı nasıl keşfetmediğinizi merak ediyorum.

Java, başvurulara göre çalışır. Yani listede sakladığınız şey bir nesne değil, öbeğin içinde bir yere gerçek atanmış nesneye işaret eden bir referanstır, bu sizin LinkedList'unuz bir yerdeki bir Lorem'e ait bir bellek adresi içeriyor gibi.

iki listelerine aynı referans ekleyerek olduğundan, her iki referans (onlar sadece bir referansı içerdiğinden teknik olarak iki LinkedList hiçbirinde yer almayan) aynı Lorem örneğine işaret edecektir.

İki farklı öğe saklamak istiyorsanız, yeni bir nesne ayırmanız gerekir (ve muhtemelen durumu kopyala/aktar).

+0

Haklısınız. Belki de bilgi sistemi geliştirmede nadiren ya da hiç böyle bir durumda olmadığım için. Çözüm için teşekkürler. – imeluntuk

İlgili konular