Kopier en liste til en annen liste i Java

1. Oversikt

I denne raske opplæringen viser vi forskjellige måter å kopiere en Liste til en annen Liste og en vanlig feil produsert i prosessen.

For en introduksjon til bruken av Samlinger, se denne artikkelen her.

2. Konstruktør

En enkel måte å kopiere en Liste er ved å bruke konstruktøren som tar en samling som argument:

Listekopi = ny ArrayList (liste);

På grunn av det faktum at vi kopierer referanse her og ikke kloner objektene, vil alle endringer som gjøres i ett element påvirke begge listene.

Av den grunn er det bra å bruke konstruktøren til å kopiere uforanderlige objekter:

Listekopi = ny ArrayList (liste);

Heltall er en uforanderlig klasse, blir verdien satt når forekomsten opprettes og kan aldri endres.

An Heltall referanse kan således deles av flere lister og tråder, og det er ingen måte noen kan endre verdien på.

3. ListeConcurrentAccessException

Et vanlig problem å jobbe med lister er ConcurrentAccessException. Dette kan bety at vi endrer listen mens vi prøver å kopiere den, sannsynligvis i en annen tråd.

For å fikse dette problemet må vi enten:

  • Bruk et designet for samtidig tilgangsinnsamling
  • Lås samlingen på riktig måte for å gjenta den
  • Finn en måte å unngå å måtte kopiere den originale samlingen

Med tanke på vår siste tilnærming er den ikke trådsikker. Så hvis vi vil løse problemet vårt med det første alternativet, kan det være lurt å bruke CopyOnWriteArrayList, der alle mutative operasjoner er implementert ved å lage en ny kopi av den underliggende matrisen.

For mer informasjon, se denne artikkelen.

I tilfelle vi vil låse Samling, det er mulig å bruke en primitiv lås for å serieisere lese- / skrivetilgang, for eksempel ReentrantReadWriteLock.

4. Legg til alle

En annen tilnærming til å kopiere elementer er å bruke Legg til alle metode:

Listekopi = ny ArrayList (); copy.addAll (liste);

Når du bruker denne metoden, er det viktig å huske at innholdet i begge lister, som med konstruktøren, vil referere til de samme objektene.

5. Collections.copy

De Samlinger klasse består utelukkende av statiske metoder som driver eller returnerer samlinger.

En av dem er kopiere, som trenger en kildeliste og en destinasjonsliste minst like lenge som kilden.

Det vil opprettholde indeksen for hvert kopierte element i destinasjonslisten, for eksempel originalen:

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

I eksemplet ovenfor, alle de forrige elementene i dest listen ble overskrevet fordi begge listene har samme størrelse.

I tilfelle destinasjonslistestørrelsen er større enn kilden:

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

Bare de tre første elementene ble overskrevet mens resten av elementene i listen er bevart.

6. Bruke Java 8

Denne versjonen av Java åpner mulighetene våre ved å legge til nye verktøy. Den vi skal utforske i de neste eksemplene er Strøm:

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

De viktigste fordelene med denne måten er muligheten til å bruke skip og filtre. I neste eksempel skal vi hoppe over det første elementet:

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

Det er mulig å filtrere etter lengden på String også eller ved å sammenligne et attributt av objektene våre:

Liste kopi = liste.strøm () .filter (s -> s.lengde ()> 10). Samle (Collectors.toList ());
List blomster = list.stream () .filter (f -> f.getPetals ()> 6) .collect (Collectors.toList ());

Det er sannsynlig at vi vil jobbe på en null-sikker måte:

List blomster = Valgfritt.ofNullable (liste) .kart (Liste :: stream) .orElseGet (Stream :: tom) .collect (Collectors.toList ());

Og hopp over et element på denne måten også:

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

7. Bruke Java 10

Endelig tillater en av de siste Java-versjonene oss å lage en uforanderlig Liste inneholder elementene i det gitte Samling:

Listekopi = List.copyOf (liste);
De eneste betingelsene er at den gitte samlingen ikke må være null, og den ikke må inneholde noen nullelementer.

8. Konklusjon

I denne artikkelen har vi utforsket forskjellige måter å kopiere en Liste til en annen Liste med forskjellige Java versjoner og en vanlig feil produsert i prosessen. Som alltid kan kodeeksempler bli funnet på GitHub her og her.

$config[zx-auto] not found$config[zx-overlay] not found