Listát másolhat a Java másik listájára

1. Áttekintés

Ebben a gyors bemutatóban különböző módszereket mutatunk be az a másolásához Lista másiknak Lista és a folyamat során előállt gyakori hiba.

Bevezetés a Gyűjtemények, kérjük, olvassa el ezt a cikket itt.

2. Konstruktor

A másolás egyszerű módja a Lista a konstruktort használja, amely argumentumként egy gyűjteményt vesz fel:

Lista másolat = new ArrayList (lista);

Annak a ténynek köszönhetően, hogy itt referenciákat másolunk, és nem klónozzuk az objektumokat, az egy elemben végrehajtott minden módosítás mindkét listára hatással lesz.

Ezért a konstruktor használata jó a megváltoztathatatlan objektumok másolásához:

Lista másolat = new ArrayList (lista);

Egész szám változhatatlan osztály, értéke a példány létrehozásakor kerül meghatározásra, és soha nem változhat.

An Egész szám A hivatkozás így több listán és szálon is megosztható, így senki sem változtathatja meg az értékét.

3. ListaConcurrentAccessException

A listákkal való munka során gyakori probléma a ConcurrentAccessException. Ez azt jelentheti, hogy módosítjuk a listát, miközben megpróbáljuk másolni, valószínűleg egy másik szálon.

A probléma megoldásához a következőket kell tennünk:

  • Használjon egyidejűleg egyidejű hozzáférés-gyűjtést
  • Zárja le megfelelően a gyűjteményt, hogy ismétlődjön rajta
  • Keresse meg a módját annak elkerülésére, hogy az eredeti gyűjteményt másolni kell

Utolsó megközelítésünket tekintve ez nem biztonságos a menetben. Annak érdekében, hogy ha az első lehetőséggel szeretnénk megoldani a problémánkat, érdemes használni CopyOnWriteArrayList, amelyben az összes mutációs műveletet az alapul szolgáló tömb friss másolatának elkészítésével hajtják végre.

További információkért kérjük, olvassa el ezt a cikket.

Abban az esetben, ha zárolni akarjuk a Gyűjtemény, lehetséges egy zárolási primitív használata az olvasási / írási hozzáférés sorosítására, mint pl ReentrantReadWriteLock.

4. Az összes hozzáadása

Az elemek másolásának másik megközelítése a az összes hozzáadása módszer:

Lista másolat = new ArrayList (); copy.addAll (lista);

Fontos szem előtt tartani ezt a módszert, amikor a konstruktorhoz hasonlóan mindkét lista tartalma ugyanazokra az objektumokra fog hivatkozni.

5. Gyűjtemények.másolat

A Gyűjtemények osztály kizárólag statikus módszerekből áll, amelyek a gyűjteményeket működtetik vagy visszaküldik.

Az egyik ilyen másolat, amelynek forráslistára és céllistára van szüksége legalább olyan hosszú ideig, mint a forrás.

Fenntartja a céllista minden másolt elemének indexét, például az eredetit:

Lista forrása = Arrays.asList (1,2,3); Lista dest = tömbök.asList (4,5,6); Gyűjtemények.másolat (dest, forrás);

A fenti példában az összes előző elem a rend a listát felülírták, mert mindkét lista azonos méretű.

Abban az esetben, ha a céllista mérete nagyobb, mint a forrás:

Lista forrása = Arrays.asList (1, 2, 3); Lista dest = tömbök. AsList (5, 6, 7, 8, 9, 10); Gyűjtemények.másolat (dest, forrás);

Csak a három első elemet felülírta, míg a lista többi eleme megmaradt.

6. A Java 8 használata

A Java ezen verziója új eszközök hozzáadásával nyitja meg lehetőségeinket. A következő példákban feltárjuk Folyam:

Lista másolat = list.stream () .collect (Collectors.toList ());

Ennek a fő előnye a kihagyás és a szűrők használata. A következő példában kihagyjuk az első elemet:

Lista másolat = list.stream () .skip (1) .collect (Collectors.toList ());

Lehetőség van a Húr vagy az objektumaink egyik tulajdonságának összehasonlításával:

Lista másolat = list.stream () .filter (s -> s.length ()> 10) .collect (Collectors.toList ());
Viráglista = list.stream () .filter (f -> f.getPetals ()> 6) .collect (Collectors.toList ());

Valószínűleg semmitmondó módon akarunk dolgozni:

Viráglista = Opcionális.Nullable (lista) .térkép (Lista :: folyam) .vagyElseGet (Patak :: üres) .collect (Collectors.toList ());

És kihagy egy elemet ezzel a módszerrel is:

Viráglista = Opcionális.Nullable (lista) .map (Lista :: folyam) .orElseGet (Stream :: üres) .skip (1) .collect (Collectors.toList ());

7. A Java 10 használata

Végül az egyik utolsó Java verzió lehetővé teszi számunkra, hogy megváltoztathatatlant hozzunk létre Lista az adott elem elemeit tartalmazza Gyűjtemény:

Lista másolat = List.copyOf (lista);
Az egyetlen feltétel, hogy az adott Gyűjtemény ne legyen null, és ne tartalmazzon semmilyen null elemet.

8. Következtetés

Ebben a cikkben különböző módszereket tártunk fel az a másolására Lista másiknak Lista mással Jáva verziók és a folyamat során előállt gyakori hiba. Mint mindig, a kódminták megtalálhatók a GitHubon itt és itt.