2016-04-12 8 views
-1

Ich bemerke gerade seltsames Verhalten heute, auch wenn ich seit 2 Jahren in Java schreibe. nehmen hier einen Blick auf meinem Code,Deaktivieren Sie automatisch ändernden Objektwert in Java Linkedlist

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; 
    } 
    } 

Ergebnis ist wie folgt aus:

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

Und ja, das ist gleiches Objekt, hinzugefügt, um andere Liste. Eine Liste, die das Objekt speichert, wenn es state ist, ist term = "abc", tf = 2. Und die andere speichert, wenn term = "abc" und tf = 3. Und Sie können sehen, dass ich am Ende den Wert jeder Liste drucke . Überraschenderweise hat Objekt lo in lim genau den gleichen Wert mit lo im Deckel. Auch wenn ich sie nicht synchronisiere. Meine Frage ist: Warum Java automatisch aktualisiert (synchronisieren) andere Liste so? Wie kann ich dieses Verhalten deaktivieren?

+0

Ja, veränderbare Objekte sind so. – dasblinkenlight

Antwort

1

Das ist nicht überraschend und ich frage mich, wie Sie das in 2 Jahren Programmierung nicht entdeckt haben.

Java funktioniert durch Referenzen. Also, was Sie in der Liste speichern, ist kein Objekt, sondern eine Referenz, die irgendwo im Heap auf das tatsächlich zugewiesene Objekt zeigt, als ob Ihre LinkedList einfach irgendwo eine Speicheradresse zu einem Lorem enthält.

Da Sie den gleichen Verweis auf zwei Listen hinzufügen, verweisen beide Referenzen auf dieselbe Lorem Instanz (die technisch in keinem der beiden LinkedList enthalten ist, da sie nur einen Verweis darauf enthalten).

Wenn Sie zwei verschiedene Elemente speichern möchten, müssen Sie ein neues Objekt zuweisen (und möglicherweise den Status kopieren/übertragen).

+0

hast du recht. vielleicht weil ich selten oder vielleicht nie einen solchen Fall in der Entwicklung von Informationssystemen habe. Danke für die Lösung. – imeluntuk