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.