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?
Antworten:
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).
Nein, das Objekt wird nicht kopiert. (Der Verweis auf das Objekt wird kopiert.)
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]
quelle
String
und dann ändern. dhString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
pass by value
da dies zu bedeuten scheint, dass Sie nicht ändern können, was gesendet wurde, da der Wert gesendet wurde, und nicht auf etwas verweisenJede Ä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.
quelle
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
quelle
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]
quelle