Vodič kroz EnumSet

1. Uvod

U ovom uputstvu istražit ćemo EnumSet zbirka iz java.util paket i razgovarati o njegovim osobinama.

Prvo ćemo prikazati glavne značajke zbirke, a nakon toga ćemo proći kroz unutarnje dijelove razreda kako bismo shvatili njegove prednosti.

Na kraju ćemo pokriti glavne operacije koje pruža i implementirati neke osnovne primjere.

2. Što je EnumSet

An EnumSet je specijalizirana Postavi kolekcija za rad nabrajanje razreda. Provodi Postavi sučelje i proteže se od Skup sažetaka:

Čak iako Skup sažetaka i SažetakZbirka pružaju implementacije za gotovo sve metode Postavi i Kolekcija sučelja, EnumSet nadjačava većinu njih.

Kada planiramo koristiti EnumSet moramo uzeti u obzir neke važne točke:

  • Može sadržavati samo nabrajanje vrijednosti a sve vrijednosti moraju pripadati istim nabrajanje
  • Ne dopušta dodavanje null vrijednosti, bacajući a NullPointerException u pokušaju da to učini
  • Nije sigurno na niti, pa ga po potrebi moramo sinkronizirati izvana
  • Elementi se pohranjuju slijedeći redoslijed kojim su deklarirani u nabrajanje
  • Koristi iterator siguran za otkazivanje koji radi na kopiji, pa neće baciti a ConcurrentModificationException ako je zbirka izmijenjena tijekom ponavljanja

3. Zašto koristiti EnumSet

U pravilu, EnumSet uvijek treba imati prednost nad bilo kojim drugim Postavi implementacija kada pohranjujemo nabrajanje vrijednosti.

U sljedećim ćemo odjeljcima vidjeti što ovu zbirku čini boljom od ostalih. Da bismo to učinili, ukratko ćemo pokazati internacije razreda kako bismo stekli bolje razumijevanje.

3.1. Pojedinosti o provedbi

EnumSet je javnostsažetak klasa koja sadrži više statičkih tvorničkih metoda koje nam omogućuju stvaranje instanci. JDK nudi 2 različite implementacije paket-privatni i potpomognut bitnim vektorom:

  • RegularEnumSet i
  • JumboEnumSet

RegularEnumSet koristi jedan dugo da predstavlja bitni vektor. Svaki djelić dugo element predstavlja vrijednost nabrajanje. I-ta vrijednost nabrajanja pohranit će se u i-tom bitu, pa je prilično lako znati je li vrijednost prisutna ili ne. Od dugo je 64-bitni tip podataka, ova implementacija može pohraniti do 64 elementa.

S druge strane, JumboEnumSet koristi niz od dugo elementi kao bitni vektor.To ovoj implementaciji omogućuje pohranu više od 64 elementa. Djeluje prilično slično RegularEnumSet ali izvođenje nekih dodatnih proračuna kako bi se pronašao indeks niza u kojem se vrijednost čuva.

Ne iznenađuje što će prvi dugi element niza pohraniti 64 prve vrijednosti nabrajanje, drugi element sljedećih 64, i tako dalje.

EnumSet tvorničke metode stvaraju primjerke jedne ili druge implementacije, ovisno o broju elemenata nabrajanje:

if (universe.length <= 64) return new RegularEnumSet (elementType, universe); inače vraća novi JumboEnumSet (elementType, univerzum);

Imajte na umu da uzima u obzir samo veličinu nabrajanje klase, a ne broj elemenata koji će biti pohranjeni u zbirci.

3.2. Prednosti korištenja EnumSet

Zbog provedbe EnumSet koje smo gore opisali, sve metode u EnumSetu implementirane su pomoću aritmetičkih bitnih operacija. Ova izračunavanja su vrlo brza i stoga se sve osnovne operacije izvršavaju u konstantnom vremenu.

Ako usporedimo EnumSet s drugim Postavi implementacije poput HashSet, prvi je obično brži jer se vrijednosti pohranjuju u predvidljivom redoslijedu i za svaki proračun treba ispitati samo jedan bit. Za razliku od HashSet, nema potrebe za izračunavanjem hashcode pronaći pravu kantu.

Štoviše, zbog prirode bit vektora, an EnumSet je vrlo kompaktan i učinkovit. Stoga koristi manje memorije, uz sve blagodati koje donosi.

4. Glavne operacije

Većina metoda EnumSet raditi kao i svaki drugi Postavi, s izuzetkom metoda za stvaranje instanci.

U sljedećim odjeljcima detaljno ćemo prikazati sve metode stvaranja, a ukratko ćemo pokriti ostatak metoda.

U našim ćemo primjerima raditi s a Bojanabrajanje:

public enum Boja {CRVENA, ŽUTA, ZELENA, PLAVA, CRNA, BIJELA}

4.1. Kreativne metode

Najjednostavnije metode za stvaranje EnumSet jesu sve od() i nijedan od(). Na ovaj način možemo lako stvoriti EnumSet koji sadrže sve elemente našeg Boja nabrajanje:

EnumSet.allOf (Color.class);

Isto tako, možemo koristiti nijedan od() učiniti suprotno i stvoriti praznu zbirku Boja:

EnumSet.noneOf (Color.class);

Ako želimo stvoriti EnumSet s podskupom nabrajanje elementi koje možemo koristiti preopterećeni od() metode. Važno je razlikovati metode s fiksnim brojem parametara do 5 različitih i onu koja koristi varargi:

Javadoc navodi da je izvedba varargi inačica može biti sporija od ostalih zbog stvaranja niza. Stoga bismo ga trebali koristiti samo ako u početku trebamo dodati više od 5 elemenata.

Drugi način za stvaranje podskupa datoteke nabrajanje je pomoću raspon () metoda:

EnumSet.range (Color.YELLOW, Color.BLUE);

U gornjem primjeru, EnumSet sadrži sve elemente iz Žuta boja do Plava. Oni slijede redoslijed definiran u nabrajanje:

[ŽUTO, ZELENO, PLAVO]

Primijetite da uključuje i prvi i zadnji navedeni element.

Druga korisna tvornička metoda je complementOf () što nam omogućuje da izuzmemo elemente prosljeđene kao parametri. Stvorimo EnumSet sa svim Boja elementi osim crno-bijelog:

EnumSet.complementOf (EnumSet.of (Color.BLACK, Color.WHITE));

Ako tiskamo ovu kolekciju, možemo vidjeti da ona sadrži sve ostale elemente:

[CRVENA, ŽUTA, ZELENA, PLAVA]

Konačno, možemo stvoriti EnumSet kopiranjem svih elemenata iz drugog EnumSet:

EnumSet.copyOf (EnumSet.of (Color.BLACK, Color.WHITE));

Interno poziva klon metoda.

Štoviše, također možemo kopirati sve elemente iz bilo kojeg Kolekcija koji sadrži nabrajanje elementi. Upotrijebimo ga za kopiranje svih elemenata popisa:

Popis colorsList = novi ArrayList (); colorsList.add (Color.RED); EnumSet listCopy = EnumSet.copyOf (popis boja);

U ovom slučaju, listCopy sadrži samo crvenu boju.

4.2. Ostale operacije

Ostatak operacija radi na potpuno isti način kao i bilo koji drugi Postavi implementacije i nema razlike u načinu njihovog korištenja.

Stoga lako možemo stvoriti prazno EnumSet i dodajte neke elemente:

EnumSet set = EnumSet.noneOf (Color.class); set.add (Color.RED); set.add (Boja.ŽUTA)

Provjerite sadrži li zbirka određeni element:

set.contens (Color.RED);

Ponavljajte elemente:

set.forEach (System.out :: println);

Ili jednostavno uklonite elemente:

set.remove (Color.RED);

To je, naravno, među svim ostalim operacijama koje a Postavi podupire.

5. Zaključak

U ovom smo članku prikazali glavne značajke EnumSet, njegova interna primjena i kako možemo imati koristi od njezine upotrebe.

Također smo pokrili glavne metode koje nudi i implementirali neke primjere kako bismo pokazali kako ih možemo koristiti.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.


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