Skopírujte zoznam do iného zoznamu v prostredí Java

1. Prehľad

V tomto rýchlom návode si ukážeme rôzne spôsoby kopírovania súboru Zoznam do iného Zoznam a bežná chyba spôsobená v procese.

Pre úvod do používania Zbierky, pozrite si prosím tento článok tu.

2. Konštruktér

Jednoduchý spôsob kopírovania súboru Zoznam je pomocou konštruktora, ktorý berie ako argument kolekciu:

Kópia zoznamu = nový ArrayList (zoznam);

Vzhľadom na to, že tu kopírujeme referenciu a neklonujeme objekty, každá zmena vykonaná v jednom prvku ovplyvní oba zoznamy.

Z tohto dôvodu je použitie konštruktora dobré na kopírovanie nemenných objektov:

Kópia zoznamu = nový ArrayList (zoznam);

Celé číslo je nemenná trieda, jej hodnota sa nastaví pri vytvorení inštancie a nikdy sa nemôže zmeniť.

An Celé číslo referencia tak môže byť zdieľaná viacerými zoznamami a vláknami a nie je možné, aby niekto zmenil jej hodnotu.

3. ZoznamConcurrentAccessException

Spoločným problémom pri práci so zoznamami je ConcurrentAccessException. To by mohlo znamenať, že zoznam upravujeme, zatiaľ čo sa ho pokúšame kopírovať, pravdepodobne v inom vlákne.

Na vyriešenie tohto problému musíme buď:

  • Používajte určené na zhromažďovanie súbežného prístupu
  • Zamknite zbierku vhodným spôsobom, aby ste ju mohli iterovať
  • Nájdite spôsob, ako zabrániť kopírovaniu pôvodnej zbierky

Vzhľadom na náš posledný prístup nie je bezpečný pre vlákna. Takže ak chceme vyriešiť náš problém prvou možnosťou, možno budeme chcieť použiť CopyOnWriteArrayList, v ktorom sú všetky mutačné operácie implementované vytvorením novej kópie základného poľa.

Ďalšie informácie nájdete v tomto článku.

V prípade, že chceme zamknúť Zbierka, je možné použiť primitívny zámok na serializáciu prístupu na čítanie a zápis, ako napr ReentrantReadWriteLock.

4. Pridať všetko

Ďalším prístupom k kopírovaniu prvkov je použitie pridať všetko metóda:

Zoznam kópií = nový ArrayList (); copy.addAll (zoznam);

Je dôležité mať na pamäti pri každom použití tejto metódy, že rovnako ako v prípade konštruktora, obsah oboch zoznamov bude odkazovať na rovnaké objekty.

5. Zbierky.kopírovať

The Zbierky trieda pozostáva výlučne zo statických metód, ktoré fungujú na alebo vracajú zbierky.

Jedným z nich je kópia, ktorý vyžaduje zoznam zdrojov a cieľový zoznam minimálne tak dlhý ako zdroj.

Zachová index každého skopírovaného prvku v zozname cieľov, napríklad originálu:

Zoznam zdrojov = Arrays.asList (1,2,3); List dest = Arrays.asList (4,5,6); Zbierky.kópia (cieľ, zdroj);

Vo vyššie uvedenom príklade sú všetky predchádzajúce prvky v cieľ boli prepísané, pretože obidva zoznamy majú rovnakú veľkosť.

V prípade, že je cieľový zoznam väčší ako zdroj:

Zoznam zdrojov = Arrays.asList (1, 2, 3); List dest = Arrays.asList (5, 6, 7, 8, 9, 10); Zbierky.kópia (cieľ, zdroj);

Iba tri prvé položky boli prepísané, zatiaľ čo ostatné prvky v zozname sú zachované.

6. Používanie Java 8

Táto verzia Java otvára naše možnosti pridaním nových nástrojov. Tú, ktorú preskúmame v nasledujúcich príkladoch, je Prúd:

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

Hlavnými výhodami tohto spôsobu je možnosť použiť preskočenie a filtre. V nasledujúcom príklade preskočíme prvý prvok:

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

Je možné filtrovať podľa dĺžky String tiež alebo porovnaním atribútu našich objektov:

Zoznam copy = list.stream () .filter (s -> s.length ()> 10) .collect (Collectors.toList ());
Zoznam kvetov = list.stream () .filter (f -> f.getPetals ()> 6) .collect (Collectors.toList ());

Je pravdepodobné, že chceme pracovať bezpečným spôsobom:

Zoznam kvetov = Voliteľné.ofNullable (zoznam) .map (Zoznam :: stream) .orElseGet (Stream :: prázdny) .collect (Collectors.toList ());

A preskočte prvok aj týmto spôsobom:

Zoznam kvetín = Voliteľné.ofNullable (zoznam) .map (Zoznam :: prúd) .orElseGet (prúd :: prázdny) .skip (1) .collect (Collectors.toList ());

7. Používanie Java 10

A nakoniec, jedna z posledných verzií Java nám umožňuje vytvoriť nemenné Zoznam obsahujúci prvky daného Zbierka:

List copy = List.copyOf (zoznam);
Jedinou podmienkou je, že daná kolekcia nesmie mať hodnotu null a nesmie obsahovať žiadne prvky null.

8. Záver

V tomto článku sme preskúmali rôzne spôsoby kopírovania súboru Zoznam do iného Zoznam s rôznymi Java verzie a bežná chyba spôsobená v procese. Ako vždy, vzorky kódu nájdete na GitHub tu a tu.

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