Fügen Sie einer ArrayList ein Objekt hinzu und ändern Sie es später

79

Wenn ich eine ArrayList habe und ein Objekt hinzugefügt und später dieses Objekt geändert habe, wird diese Änderung in der ArrayList wiedergegeben? oder wenn ich das Objekt zur ArrayList hinzufüge, erstellt Java eine Kopie und fügt sie der ArrayList hinzu?

Was passiert, wenn ich den Verweis auf dieses Objekt auf null ändere? Bedeutet das, dass das Objekt in der ArrayList jetzt auch null ist?

K ''
quelle
1
Diese Frage (& Antwort) verdient wirklich ein Lesezeichen!
Terry
Nur alle Fragen, die ich stellen wollte :)
navid

Antworten:

83

Wird sich diese Änderung in der ArrayList widerspiegeln?

Ja, da Sie einen Verweis auf das Objekt in der Liste hinzugefügt haben . Die von Ihnen hinzugefügte Referenz verweist weiterhin auf dasselbe Objekt (das Sie geändert haben).


oder wenn ich das Objekt zur ArrayList hinzufüge, erstellt Java eine Kopie und fügt sie der ArrayList hinzu?

Nein, das Objekt wird nicht kopiert. (Der Verweis auf das Objekt wird kopiert.)


Was passiert, wenn ich den Verweis auf dieses Objekt auf null ändere? Bedeutet das, dass das Objekt in der ArrayList jetzt auch null ist?

Nein, da der Inhalt der ursprünglichen Referenz beim Hinzufügen zur Liste kopiert wurde . (Denken Sie daran, dass die Referenz kopiert wird, nicht das Objekt.)

Demonstration:

StringBuffer sb = new StringBuffer("foo");

List<StringBuffer> list = new ArrayList<StringBuffer>();
list.add(sb);

System.out.println(list);   // prints [foo]
sb.append("bar");

System.out.println(list);   // prints [foobar]

sb = null;

System.out.println(list);   // still prints [foobar]
aioobe
quelle
was ist damit: Button a = neuer Button; Button b = neuer Button; Tastenstrom = a; List.add (aktuell); Strom = b; Wenn ich den Listeninhalt drucke, wird es "a" oder "b" sein?
Lorenzo Sciuto
1
@aioobe Ihre Antwort scheint mit dem ersten Punkt in Ihrem Beitrag in Konflikt zu stehen, an dem Sie angeben, dass der Verweis auf das Objekt kopiert wird (in diesem Fall 'aktuell'), der dann von a nach b geändert wird. Ich hätte erwartet, dass es druckt b. Können Sie das näher erläutern?
Jan Kuboschek
2
Denken Sie daran, dass Java immer als Wert übergeben wird (insbesondere Verweise auf Objekte werden als Wert übergeben) und dass alles klar sein sollte.
Aioobe
Dies scheint nicht der Fall zu sein, wenn Sie ein hinzufügen Stringund dann ändern. dhString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
Don Cheadle
Ich denke, Sie möchten vielleicht klarstellen, was damit gemeint ist, pass by valueda dies zu bedeuten scheint, dass Sie nicht ändern können, was gesendet wurde, da der Wert gesendet wurde, und nicht auf etwas verweisen
Don Cheadle
5

Jede Änderung am Objekt wird in der Liste angezeigt.

Wenn Sie jedoch mit Objekten wie unveränderlichen Zeichenfolgen arbeiten, wird bei "Änderungsvorgängen" ein neues Objekt erstellt. Dann ist Ihr altes Objekt noch in der Liste, während Sie an anderer Stelle ein neues haben.

DerMike
quelle
Dies ist eine sehr wichtige Unterscheidung
Don Cheadle
1

Vielen Dank an alle. Ich habe es wieder herausgefunden, indem ich Ihre Beiträge gelesen habe. Es ist wahrscheinlich ein verwirrendes Konzept, da ich es schon vor langer Zeit verdaut habe, aber kürzlich habe ich vergessen, wie es wieder funktioniert. Also möchte ich den Schlüssel teilen, der das Problem für mich löst. (Beachten Sie, dass nicht-primitive Objekte (Primitive sind int, boolean usw.) in Java technisch gesehen Zeiger sind.) Wenn u das Hinzufügen Objekt o zu einer Liste, die Liste und die o Punkte auf die gleiche Sache so , wenn u ändern o die Sache des Liste ändert. Dies ist so lange, wie sie auf dasselbe zeigen und brechen, wenn o durch = auf etwas anderes zeigt .

o = null;   //o points to nothing and changes in o from now on doesn't effect the list's item

oder

Object a = new Object();
o = a;    //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)

hoffe es hilft jemandem

navid
quelle
-1

Wollte eine weitere Demonstration hinzufügen, bei der sich die ArrayList innerhalb einer Map als Wert befindet. Die ArrayList wird nach dem Hinzufügen zur Karte geändert und die Karte spiegelt die Änderungen wider.

Die Karte enthält ein Element mit dem Namen der Mutter als Schlüssel und den Kindern als Wert.

    String key = "adeleMom";
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> firstList = new ArrayList<String>();
    firstList.add("adele");
    myMap.put(key, firstList);
    firstList = null;
    ArrayList secondList = myMap.get(key);
    System.out.println(secondList); // prints [adele]
    secondList.add("bonnie");
    System.out.println("Added bonnie");
    ArrayList thirdList = myMap.get(key);
    System.out.println(thirdList); // prints [adele, bonnie]
user2176745
quelle