Vejledning til EnumSet

1. Introduktion

I denne vejledning undersøger vi EnumSet samling fra java.util pakke og diskutere dens særheder.

Vi viser først de vigtigste funktioner i samlingen, og derefter gennemgår vi klassens interne for at forstå fordelene ved det.

Endelig dækker vi de vigtigste operationer, som det giver, og implementerer nogle grundlæggende eksempler.

2. Hvad er en EnumSet

En EnumSet er specialiseret Sæt samling at arbejde med enum klasser. Det implementerer Sæt interface og strækker sig fra Abstrakt sæt:

Selv om Abstrakt sæt og Abstrakt Samling give implementeringer til næsten alle metoder til Sæt og Kollektion grænseflader, EnumSet tilsidesætter de fleste af dem.

Når vi planlægger at bruge en EnumSet vi er nødt til at tage nogle vigtige punkter i betragtning:

  • Den kan kun indeholde enum værdier og alle værdier skal tilhøre det samme enum
  • Det tillader ikke at tilføje nulværdier, kaster en NullPointerException i et forsøg på at gøre det
  • Det er ikke trådsikkert, så vi er nødt til at synkronisere det eksternt, hvis det kræves
  • Elementerne opbevares i den rækkefølge, de erklæres i enum
  • Det bruger en fejlsikker iterator der fungerer på en kopi, så det smider ikke et ConcurrentModificationException hvis samlingen ændres, når den gentages over den

3. Hvorfor bruge EnumSet

Som en tommelfingerregel, EnumSet bør altid foretrækkes frem for andre Sæt implementering, når vi lagrer enum værdier.

I de næste sektioner vil vi se, hvad der gør denne samling bedre end andre. For at gøre det viser vi kort tidens interne for at få en bedre forståelse.

3.1. Implementeringsoplysninger

EnumSet er en offentligabstrakt klasse, der indeholder flere statiske fabriksmetoder, der giver os mulighed for at oprette forekomster. JDK leverer 2 forskellige implementeringer - er pakke-privat og bakket op af en smule vektor:

  • RegularEnumSet og
  • JumboEnumSet

RegularEnumSet bruger en enkelt lang til at repræsentere bitvektoren. Hver bit af lang element repræsenterer en værdi af enum. Den i-værdi af enummet gemmes i den i-bit, så det er ret nemt at vide, om en værdi er til stede eller ej. Siden lang er en 64-bit datatype, kan denne implementering gemme op til 64 elementer.

På den anden side, JumboEnumSet bruger en række af lang elementer som en smule vektor.Dette lader denne implementering gemme mere end 64 elementer. Det fungerer stort set som RegularEnumSet men foretager nogle ekstra beregninger for at finde matrixindekset, hvor værdien er gemt.

Ikke overraskende lagrer det første lange element i arrayet de 64 første værdier i enum, det andet element det næste 64 osv.

EnumSet fabriksmetoder skaber forekomster af en eller anden implementering afhængigt af antallet af elementer i enum:

hvis (universe.length <= 64) returnerer nyt RegularEnumSet (elementType, universe); ellers returnerer nyt JumboEnumSet (elementType, univers);

Husk, at det kun tager højde for størrelsen på enum klasse, ikke antallet af elementer, der gemmes i samlingen.

3.2. Fordele ved at bruge en EnumSet

På grund af implementeringen af ​​en EnumSet som vi har beskrevet ovenfor, alle metoderne i et EnumSet er implementeret ved hjælp af aritmetiske bitvise operationer. Disse beregninger er meget hurtige, og derfor udføres alle de grundlæggende operationer i en konstant tid.

Hvis vi sammenligner EnumSet med andre Sæt implementeringer som HashSet, den første er normalt hurtigere, fordi værdierne er gemt i en forudsigelig rækkefølge, og kun en bit skal undersøges for hver beregning. I modsætning til HashSet, er der ingen grund til at beregne hashcode at finde den rigtige spand.

Desuden på grund af bitvektorernes beskaffenhed, an EnumSet er meget kompakt og effektiv. Derfor bruger den mindre hukommelse med alle de fordele, det medfører.

4. Hovedoperationer

De fleste af metoderne til en EnumSet arbejde som alle andre Sæt, med undtagelse af metoderne til at oprette forekomster.

I de næste sektioner viser vi detaljeret alle de oprettelsesmetoder, og vi dækker kort resten af ​​metoderne.

I vores eksempler arbejder vi med en Farveenum:

offentlig enum Farve {RØD, GUL, GRØN, BLÅ, SORT, HVID}

4.1. Skabelsesmetoder

De mest enkle metoder til at oprette en EnumSet er alt af() og ingen af(). På denne måde kan vi nemt oprette en EnumSet indeholder alle elementerne i vores Farve enum:

EnumSet.allOf (Color.class);

Ligeledes kan vi bruge ingen af() at gøre det modsatte og oprette en tom samling af Farve:

EnumSet.noneOf (Color.class);

Hvis vi vil oprette en EnumSet med en delmængde af enum elementer, vi kan bruge overbelastet af() metoder. Det er vigtigt at skelne mellem metoderne med et fast antal parametre op til 5 forskellige og den, der bruger varargs:

Javadoc siger, at udførelsen af varargs version kan være langsommere end de andre på grund af oprettelsen af ​​arrayet. Derfor skal vi kun bruge det, hvis vi oprindeligt har brug for at tilføje mere end 5 elementer.

En anden måde at oprette et undersæt på et enum er ved hjælp af rækkevidde() metode:

EnumSet.range (Farve.GUL, Farve.BLÅ);

I eksemplet ovenfor er EnumSet indeholder alle elementerne fra Gul til Blå. De følger den rækkefølge, der er defineret i enum:

[GUL, GRØN, BLÅ]

Bemærk, at det inkluderer både det første og det sidste angivne element.

En anden nyttig fabriksmetode er supplementOf () der giver os mulighed for at udelukke de elementer, der er sendt som parametre. Lad os oprette en EnumSet med alle Farve elementer undtagen sort og hvid:

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

Hvis vi udskriver denne samling, kan vi se, at den indeholder alle de andre elementer:

[RØD, GUL, GRØN, BLÅ]

Langt om længe, vi kan skabe en EnumSet ved at kopiere alle elementerne fra en anden EnumSet:

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

Internt kalder det klon metode.

I øvrigt, vi kan også kopiere alle elementerne fra enhver Kollektion der indeholder enum elementer. Lad os bruge det til at kopiere alle elementerne på en liste:

Liste farverListe = ny ArrayList (); colourList.add (Color.RED); EnumSet listCopy = EnumSet.copyOf (colorsList);

I dette tilfælde er listCopy indeholder kun den røde farve.

4.2. Andre operationer

Resten af ​​operationerne fungerer på nøjagtig samme måde som enhver anden Sæt implementering, og der er ingen forskel i, hvordan man bruger dem.

Derfor kan vi nemt oprette en tom EnumSet og tilføj nogle elementer:

EnumSet set = EnumSet.noneOf (Color.class); set.add (Color.RED); set.add (farve.GUL)

Kontroller, om samlingen indeholder et bestemt element:

set.contains (Color.RED);

Iterere over elementerne:

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

Eller bare fjern elementer:

set.remove (Color.RED);

Dette naturligvis blandt alle de andre operationer, som a Sæt bakker op.

5. Konklusion

I denne artikel har vi vist de vigtigste funktioner i EnumSet, dens interne implementering, og hvordan vi kan drage fordel af at bruge den.

Vi har også dækket de vigtigste metoder, som det tilbyder, og implementeret nogle eksempler for at vise, hvordan vi kan bruge dem.

Som altid er den fulde kildekode for eksemplerne tilgængelig på GitHub.


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