Öt dolog, amit nem tudni

Java Collections API sok Java developers-érzékelték, mint egy nagyon hasznos helyett a szabványos tömbök, kiküszöbölve azok hátrányait. Társítása gyűjtemények elsősorban ArrayList nem egy nagy hiba, de azok, akik keresnek lehet felfedezni a gyűjtemény még sok más.

Erről a sorozat

Azt hiszed, hogy hogyan kell programozni Java? Tény, hogy a fejlesztők többsége csak felületesen ismeri a Java platform, a tanulás, amire szüksége van, hogy ezt a munkát. Ebben a sorozatban, Ted Neward delves az alapvető funkciókat a Java platform beszélni kevésbé ismert tényeket, amelyek ismerete segíthet megoldani a legösszetettebb programozási feladatot.

Hasonlóképpen, bár a térkép (és annak széles körű végrehajtását HashMap) egy nagyszerű módja annak, hogy hozzon létre név-érték párok, vagy a kulcs-érték, nincs ok arra, hogy korlátozza magát, hogy ezeket az ismerős eszközöket. Meg tudod oldani egy csomó esetleges hibás kód által választott a API, vagy akár a megfelelő gyűjtemény.

1. gyűjtemények helyett tömbök

Például, hogy létrehoz a tartalmát a tömb vonalat kell haladjon végig a teljes tömböt, és hogy összekapcsolják a tartalmát az összes elemet egyetlen objektum karakterlánc. mivel a gyűjtemény egy kész eljárás megvalósítása toString ().

Kevés kivételtől eltekintve, ajánlott mindenkinek jön, hogyan kell átalakítani egy tömb a gyűjtemény a lehető leghamarabb. Ez felveti azt a kérdést: hogyan lehet a legkönnyebben végrehajtani egy ilyen átalakulás? Kiderült, API Java gyűjtemények teszi ezt a feladatot nagyon egyszerű, ahogy azt az 1. lista:

1. listán ArrayToList

Felhívjuk figyelmét, hogy a visszaküldött gyűjtemény List megváltoztathatatlan, így próbál új elemet eredményez ejekciós UnsupportedOperationException kivétel.

És mivel a módszer Arrays.asList (), hogy új elemek listája paramétert használjuk varargs. akkor könnyen létrehozhat egy listát gyűjteménye az újonnan létrehozott objektumok.

2. iteráció hatékony

Gyakran szükség van, hogy mozog a tartalmát egy gyűjtemény (különösen az egyik, hogy jött létre egy tömbben) egy másik gyűjtemény, vagy töröljön néhány a tárgyakat a gyűjtemény.

Természetes megoldás itt - ez bejárható (a bejáró) gyűjtését és hozzáadni vagy eltávolítani kívánt elemeket. Azonban nem szükséges megtenni.

Iteration ebben az esetben néhány komoly hátránya van:

  • nem hatékony átméretezés gyűjtemény minden egyes hozzáadása vagy eltávolítása a tagja;
  • valahányszor egy kioldó műveletet végzünk, és a zár lehet kapcsolatos problémákat konkurencia;
  • lehet versenyezni a helyzet a hozzáférést a gyűjtemény az egyéb gazdasági folyamatok idején hozzáadásával vagy eltávolításával elemekkel.

Mindezek a problémák elkerülhetők módszerekkel addAll vagy removeAll. átadva őket egy gyűjtemény tartalmazó elemeket hozzáadni vagy törölni.

3. A ciklus bármely tárgy Iterable interfész

Részletes ciklusa - ez az egyik leghasznosabb fejlesztések kerültek a Java 5, amellyel eltávolították az utolsó akadály dolgozni gyűjtemények Java.

Korábban, a fejlesztők kézzel kellett szerezni bejáró. akkor használja a módszer a következő (), hogy az objektum, amely jelzi a Iterátor, majd ellenőriztük a hasNext () módszer. több tárgyat. Kezdve Java 5, akkor helyette egy ciklusban, amelyben mindez automatikusan történik.

Tény, hogy ebben a ciklusban is használható, ha dolgozik, minden olyan tárgy, amely megvalósítja a Iterable felületen. nem csak a gyűjtemények.

2. lista mutatja, hogy egy listát a gyermekek Person objektum kapható bejáró. Ahelyett, hogy átmenjen a utalást a belső List (amely lehetővé teszi, hogy a hívó fél a külső a fő célja, hogy adjunk a gyerekeknek -, hogy nem szerettem volna a szülők többsége), személy típus valósítja Iterable felület. Ez a megközelítés lehetővé teszi a fokozott hurok, hogy megkerülje a gyerekek a Person objektum.

2. lista Bővített ciklus: mutasd meg a gyerekek

Segítségével Iterable van néhány nyilvánvaló hátránya a szimuláció domain, hiszen segítségével iterator () metódus csak egy gyűjtemény a tárgyakat lehet támogatni ezáltal. Ahhoz azonban, hogy az ilyen esetekben, ahol a gyűjtemény gyerekek kínálkozik, a Iterable felület teszi domén programozás sokkal könnyebb és tisztább.

4. Klasszikus és egyedi algoritmusok

Mint ha valaha is körül a gyűjtemény, de nem közvetlenül, hanem fordított sorrendben? Lehet itt hasznos algoritmus Java gyűjtemények.

2. listában gyerekek a Person objektum szerepel a sorrendben, ahogy átadták, de most szeretnénk felsorolni őket fordított sorrendben. Tudnék írni egy hurok, és helyezze be az új objektum egy ArrayList fordított sorrendben, de abroncs használata ezt a kódot a harmadik vagy negyedik alkalommal.

Ott lehet alkalmazni méltánytalanul ritkán használt algoritmus a 3. listában.

3. lista ReverseIterator

A gyűjtemények osztályban van egy pár ilyen „algoritmusok” - egy statikus módszer, amely úgy, mint a paraméter egy objektum gyűjtemények osztály és teljesítenek a gyűjtemény függetlenek a fellépés végrehajtásához.

Sőt, a bemutatott algoritmusok a gyűjtemények osztályban. biztosan nem az utolsó szó a méltó építészeti az API-t. Például, azt szeretné, hogy a módszer nem változik a tartalom a (átvitt saját gyűjtemény) közvetlenül. Ilyen esetekben, amennyiben képes írni az egyéni algoritmusok, amelyek közül az egyik példaként bemutatott 4. listában.

4. lista egyszerűsítése ReverseIterator

5. Táguló Collections API

A fenti ábra a szokás algoritmus a legmodernebb gyűjtemények API Java: bővíthető és módosítható igényei szerint a fejlesztők.

Például, mondjuk, meg kell felsorolni a Person osztály mindig is a célja a gyermekek sorolva kor. Lehetőség van, hogy írjon egy algoritmust, amely minden egyes alkalommal rendezni a listát, (például a Collections.sort módszer), de sokkal jobb lenne, ha a gyűjtő osztály végzi ezt a válogatás is.

Sőt, talán nem is érdekel, hogy milyen sorrendben az objektumok helyezünk a gyűjtemény (ami elengedhetetlen a List gyűjtemény). Lehet, hogy egyszerűen csak szeretné tárolni őket megfelelően a rendezési sorrendet.

Sem gyűjteménye java.util csomag nem felel meg ezeknek a követelményeknek, de ez is elég könnyű írni a saját osztálya van. Mindössze annyit kell -, hogy egy interfész, amely leírja az absztrakt magatartás, amelynek biztosítania kell gyűjtemény. Például, SortedCollection interfész. amelynek rendkívül viselkedési cél (5. listát).

5. lista SortedCollection

Írja végrehajtását ezen a felületen nagyon egyszerű (lásd 6. listán).

Listing 6. ArraySortedCollection

Ez megírás „a térd”, gondolkodás nélkül az optimalizálás, és nyilvánvaló, hogy érdemes egy kis utómunka. Azonban a lényeg az, hogy a Java Collections API semmilyen esetben nem a végső megoldás a mindent kapcsolódik a gyűjtemény. Ki kell bővíteni, és arra ösztönzi őt.

Persze, néhány megoldást bővül a kategória a „nagy teljesítmény”, mint azok, amelyek megjelentek a java.util.concurrent csomagot. Azonban más bővítmények lehet elég egyszerű - például az írás egyéni algoritmus, vagy egy egyszerű bővítése a meglévő Class Collection.

Expansion API Java gyűjtemények tűnhet rendkívül nehéz, de kezdő, hogy ezt, meg fogja találni, hogy ez nem olyan nehéz, mint gondoltam.

Összefoglalva

Ahogy sorszámozás API Java API gyűjtemény tele van finomságok, ezért nem zárja be ezt a témát. A következő cikk ebben a sorozatban 5 dolog fogjuk mondani többet az öt módon, hogy minél több API Java gyűjtemények.

Kapcsolódó cikkek