Kopirajte popis na drugi popis u Javi

1. Pregled

U ovom brzom vodiču pokazat ćemo različite načine kopiranja a Popis drugom Popis i uobičajena pogreška nastala u procesu.

Za uvod u upotrebu Zbirke, pogledajte ovaj članak ovdje.

2. Konstruktor

Jednostavan način kopiranja a Popis je pomoću konstruktora koji uzima kolekciju kao svoj argument:

Kopija popisa = novi ArrayList (popis);

Zbog činjenice da ovdje kopiramo referencu, a ne kloniramo objekte, svaka izmjena i dopuna u jednom elementu utjecat će na oba popisa.

Iz tog je razloga dobro koristiti konstruktor za kopiranje nepromjenjivih objekata:

Kopija popisa = novi ArrayList (popis);

Cijeli broj je nepromjenjiva klasa, njegova se vrijednost postavlja kada se stvori instanca i nikad se ne može promijeniti.

An Cijeli broj referencu tako može dijeliti više popisa i niti i nema šanse da itko može promijeniti njezinu vrijednost.

3. PopisConcurrentAccessException

Čest problem u radu s popisima je ConcurrentAccessException. To bi moglo značiti da popis mijenjamo dok ga pokušavamo kopirati, najvjerojatnije u drugoj niti.

Da bismo riješili ovaj problem, moramo učiniti:

  • Upotrijebite dizajnirano za istovremeno prikupljanje pristupa
  • Prikladno zaključajte kolekciju da biste je prevrtali
  • Pronađite način kako izbjeći kopiranje izvorne zbirke

S obzirom na naš posljednji pristup, on nije siguran za konce. Dakle, ako želimo riješiti svoj problem prvom opcijom, možda ćemo htjeti koristiti CopyOnWriteArrayList, u kojem se provode sve mutativne operacije stvaranjem svježe kopije temeljnog niza.

Dodatne informacije potražite u ovom članku.

U slučaju da želimo zaključati Kolekcija, moguće je koristiti primitiv brave za serializiranje pristupa za čitanje / pisanje, kao što je ReentrantReadWriteLock.

4. Dodaj Sve

Drugi pristup kopiranju elemenata je korištenje Dodaj Sve metoda:

Kopija popisa = novi ArrayList (); copy.addAll (popis);

Važno je imati na umu kad god koristite ovu metodu da će se, kao i kod konstruktora, sadržaj oba popisa odnositi na iste objekte.

5. Zbirke.kopija

The Zbirke klasa se sastoji isključivo od statičkih metoda koje djeluju ili vraćaju kolekcije.

Jedan od njih je kopirati, koji treba popis izvora i popis odredišta barem onoliko dugo koliko je potreban izvor.

Održat će indeks svakog kopiranog elementa na popisu odredišta, kao što je izvornik:

Izvor popisa = Arrays.asList (1,2,3); Popis dest = Arrays.asList (4,5,6); Collections.copy (dest, izvor);

U gornjem primjeru svi prethodni elementi u dest Popis je prepisan jer oba popisa imaju istu veličinu.

U slučaju da je veličina popisa odredišta veća od izvora:

Izvor popisa = Arrays.asList (1, 2, 3); Popis dest = Arrays.asList (5, 6, 7, 8, 9, 10); Collections.copy (dest, izvor);

Prepisane su samo tri prve stavke, dok su ostali elementi na popisu sačuvani.

6. Korištenje Jave 8

Ova inačica Java otvara naše mogućnosti dodavanjem novih alata. Ona koju ćemo istražiti u sljedećim primjerima je Stream:

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

Glavne prednosti ovog načina su mogućnost korištenja preskakanja i filtara. U sljedećem primjeru preskočit ćemo prvi element:

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

Moguće je filtrirati prema duljini Niz previše ili usporedbom atributa naših predmeta:

Kopija popisa = list.stream () .filter (s -> s.length ()> 10) .collect (Collectors.toList ());
Popis cvijeća = list.stream () .filter (f -> f.getPetals ()> 6) .collect (Collectors.toList ());

Vjerojatno želimo raditi na nula-siguran način:

Popis cvijeća = Izborno.ofNullable (list) .map (List :: stream) .orElseGet (Stream :: empty) .collect (Collectors.toList ());

I preskočite element koristeći i ovaj način:

Popis cvijeća = Neobvezno.ofNullable (list) .map (List :: stream) .orElseGet (Stream :: empty) .skip (1) .collect (Collectors.toList ());

7. Korištenje Jave 10

Konačno, jedna od posljednjih Java inačica omogućuje nam stvaranje nepromjenjivog Popis koji sadrže elemente datog Kolekcija:

Kopija popisa = List.copyOf (popis);
Jedini su uvjeti da zadana Zbirka ne smije biti nula i ne smije sadržavati nikakve null elemente.

8. Zaključak

U ovom smo članku istražili različite načine kopiranja datoteke Popis drugom Popis s različitim Java verzije i uobičajena pogreška nastala u procesu. Kao i uvijek, uzorke koda možete pronaći ovdje na GitHub-u.