Kopier en liste til en anden liste i Java

1. Oversigt

I denne hurtige vejledning viser vi forskellige måder at kopiere en Liste til en anden Liste og en almindelig fejl produceret i processen.

For en introduktion til brugen af Samlingerhenvises til denne artikel her.

2. Konstruktør

En enkel måde at kopiere en Liste er ved hjælp af konstruktøren, der tager en samling som argument:

Liste kopi = ny ArrayList (liste);

På grund af det faktum, at vi kopierer reference her og ikke kloner objekterne, vil alle ændringer, der foretages i et element, påvirke begge lister.

Af den grund er det godt at bruge konstruktøren til at kopiere uforanderlige objekter:

Liste kopi = ny ArrayList (liste);

Heltal er en uforanderlig klasse, dens værdi indstilles, når forekomsten oprettes og kan aldrig ændre sig.

En Heltal reference kan således deles af flere lister og tråde, og der er ingen måde nogen kan ændre dens værdi på.

3. ListeConcurrentAccessException

Et almindeligt problem at arbejde med lister er ConcurrentAccessException. Dette kan betyde, at vi ændrer listen, mens vi prøver at kopiere den, sandsynligvis i en anden tråd.

For at løse dette problem skal vi enten:

  • Brug et designet til samtidig adgangsindsamling
  • Lås samlingen korrekt for at gentage den
  • Find en måde at undgå at skulle kopiere den originale samling

I betragtning af vores sidste tilgang er den ikke trådsikker. Så hvis vi vil løse vores problem med den første mulighed, vil vi måske bruge CopyOnWriteArrayList, hvor alle mutative operationer implementeres ved at lave en ny kopi af det underliggende array.

For yderligere information henvises til denne artikel.

Hvis vi vil låse Kollektion, er det muligt at bruge en primitiv lås til at serieisere læse- / skriveadgang, f.eks ReentrantReadWriteLock.

4. Tilføj alle

En anden tilgang til at kopiere elementer bruger tilføjAlle metode:

Liste kopi = ny ArrayList (); copy.addAll (liste);

Det er vigtigt at huske på, når du bruger denne metode, at indholdet af begge lister, som med konstruktøren, henviser til de samme objekter.

5. Collections.copy

Det Samlinger klasse består udelukkende af statiske metoder, der fungerer på eller returnerer samlinger.

En af dem er kopi, som har brug for en kildeliste og en destinationsliste mindst så længe som kilden.

Det opretholder indekset for hvert kopierede element i destinationslisten, såsom originalen:

Liste kilde = Arrays.asList (1,2,3); Liste dest = Arrays.asList (4,5,6); Collections.copy (dest, kilde);

I eksemplet ovenfor er alle de tidligere elementer i dest listen blev overskrevet, fordi begge lister har samme størrelse.

Hvis destinationslistestørrelsen er større end kilden:

Liste kilde = Arrays.asList (1, 2, 3); Liste dest = Arrays.asList (5, 6, 7, 8, 9, 10); Collections.copy (dest, kilde);

Bare de tre første emner blev overskrevet, mens resten af ​​elementerne på listen er bevaret.

6. Brug af Java 8

Denne version af Java åbner vores muligheder ved at tilføje nye værktøjer. Den, vi vil undersøge i de næste eksempler er Strøm:

List copy = list.stream () .collect (Collectors.toList ());

De største fordele ved denne måde er muligheden for at bruge skip og filtre. I det næste eksempel springer vi over det første element:

Listekopi = list.stream () .skip (1) .collect (Collectors.toList ());

Det er muligt at filtrere efter længden på Snor også eller ved at sammenligne en attribut for vores objekter:

List copy = list.stream () .filter (s -> s.length ()> 10) .collect (Collectors.toList ());
Listeblomster = liste.strøm () .filter (f -> f.getPetals ()> 6) .collect (Collectors.toList ());

Det er sandsynligt, at vi vil arbejde på en nul-sikker måde:

Liste blomster = Optional.ofNullable (liste) .map (Liste :: stream) .orElseGet (Stream :: tom) .collect (Collectors.toList ());

Og spring et element over på denne måde også:

Liste blomster = Optional.ofNullable (liste) .map (Liste :: stream) .orElseGet (Stream :: tom) .skip (1) .collect (Collectors.toList ());

7. Brug af Java 10

Endelig giver en af ​​de sidste Java-versioner os mulighed for at oprette en uforanderlig Liste indeholdende elementerne i det givne Kollektion:

Liste kopi = List.copyOf (liste);
De eneste betingelser er, at den givne samling ikke må være null, og at den ikke må indeholde nogen null-elementer.

8. Konklusion

I denne artikel har vi undersøgt forskellige måder at kopiere en Liste til en anden Liste med forskellige Java versioner og en almindelig fejl produceret i processen. Som altid kan kodeeksempler findes på GitHub her og her.