Java ArrayList-kopie

Ik heb een ArrayListl1van grootte 10. Ik wijs l1toe aan het nieuwe lijstreferentietype l2. Zullen l1en l2naar hetzelfde ArrayList-object verwijzen? Of is een kopie van het ArrayList-object toegewezen aan l2?

Als ik de l2-referentie gebruik en ik het lijstobject bijwerk, weerspiegelt dit ook de wijzigingen in het l1-referentietype.

Bijvoorbeeld:

List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
    l1.add(i);
}
List l2 = l1;
l2.clear();

Is er geen andere manier om een kopie van een lijstobject toe te wijzen aan een nieuwe referentievariabele, behalve het maken van 2 lijstobjecten en het kopiëren van verzamelingen van oud naar nieuw?


Antwoord 1, autoriteit 100%

Ja, de toewijzing kopieert gewoon de waardevan l1(wat een verwijzing is) naar l2. Ze verwijzen beide naar hetzelfde object.

Een ondiepe kopie maken is echter vrij eenvoudig:

List<Integer> newList = new ArrayList<>(oldList);

(Als een voorbeeld.)


Antwoord 2, autoriteit 14%

Probeer Collections.copy(destination, source);


Antwoord 3, autoriteit 7%

Ja l1en l2verwijzen naar dezelfde referentie, hetzelfde object.

Als u een nieuwe ArrayList wilt maken op basis van de andere ArrayList, doet u dit:

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");

Het resultaat is l1heeft nog steeds 2 elementen en l2heeft 3 elementen.


Antwoord 4, autoriteit 4%

Een andere handige manier om de waarden van src ArrayList naar dest Arraylist te kopiëren is als volgt:

ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);

Dit is het daadwerkelijk kopiëren van waarden en niet alleen het kopiëren van referentie.


Antwoord 5, autoriteit 2%

Er is een methode addAll()die dient om de ene ArrayList naar de andere te kopiëren.

Je hebt bijvoorbeeld twee arraylijsten: sourceListen targetList, gebruik onderstaande code.

targetList.addAll(sourceList);


Antwoord 6

Java geeft geen objecten door, het geeft verwijzingen (pointers) door naar objecten. Dus ja, l2 en l1 zijn twee verwijzingen naar hetzelfde object.

Je moet een expliciete kopie maken als je twee verschillende lijsten met dezelfde inhoud nodig hebt.


Antwoord 7

Alleen ter aanvulling:
Alle antwoorden hierboven gaan voor een oppervlakkige kopie – met behoud van de referentie van de originele objecten. Als je een diepe kopie wilt, moet je (referentie-)klasse in de lijst a . implementeren
clone / copy-methode, die een diepe kopie van een enkel object biedt. Dan kun je het volgende gebruiken:

newList.addAll(oldList.stream().map(s->s.clone()).collect(Collectors.toList()));

Other episodes