EnumSet
Nopeat joukko-operaatiot enum-arvoille.
EnumSet on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mikä EnumSet on?
EnumSet on erityinen Set-toteutus, joka on tarkoitettu vain enum-tyypeille.
Sisäisesti se on bittivektori: jokainen vakio vastaa yhtä bittiä. Siksi se on erittäin nopea ja vähän muistia kuluttava verrattuna enum-arvoista koostuvaan HashSetiin.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
System.out.println(weekend);
}
}Luominen of-metodilla
Tehdasmetodi EnumSet.of(...) luo joukon luetelluista vakioista. Metodista on ylikuormitetut versiot yhdestä viiteen alkioon sekä varargs-versio.
import java.util.EnumSet;
public class Main {
enum Perm { READ, WRITE, EXECUTE }
public static void main(String[] args) {
EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
System.out.println(perms);
}
}allOf ja noneOf
Kaksi muuta tehdasmetodia:
allOf(Type.class)luo joukon, joka sisältää kaikki vakiot.noneOf(Type.class)luo tyhjän joukon, johon voi lisätä alkioita.
import java.util.EnumSet;
public class Main {
enum Color { RED, GREEN, BLUE }
public static void main(String[] args) {
EnumSet<Color> all = EnumSet.allOf(Color.class);
EnumSet<Color> none = EnumSet.noneOf(Color.class);
none.add(Color.RED);
System.out.println("all: " + all);
System.out.println("built: " + none);
}
}range yhtenäisille vakioille
EnumSet.range(from, to) sisältää kaikki kahden päätepisteen väliset vakiot päätepisteet mukaan lukien, määrittelyjärjestyksessä.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
System.out.println(workdays);
}
}complementOf
EnumSet.complementOf(set) palauttaa joukon, joka sisältää kaikki annetussa joukossa olemattomat vakiot.
Tämä on nopea tapa kääntää valinta päinvastaiseksi.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
EnumSet<Day> rest = EnumSet.complementOf(work);
System.out.println(rest);
}
}Joukko-operaatiot
Koska EnumSet on varsinainen Set, käytettävissänne ovat unioni, leikkaus ja erotus metodeilla addAll, retainAll ja removeAll.
Nämä suoritetaan konepellin alla nopeina bittitason operaatioina.
import java.util.EnumSet;
public class Main {
enum Tag { A, B, C, D }
public static void main(String[] args) {
EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
EnumSet<Tag> inter = EnumSet.copyOf(x);
inter.retainAll(y);
System.out.println("intersection: " + inter);
}
}Jäsenyyden testaaminen
contains tarkistaa yhden bitin, joten sen suoritus on vakioaikainen ja erittäin nopea.
import java.util.EnumSet;
public class Main {
enum Feature { DARK_MODE, BETA, ANALYTICS }
public static void main(String[] args) {
EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
System.out.println(enabled.contains(Feature.BETA));
System.out.println(enabled.contains(Feature.ANALYTICS));
}
}EnumSet lippujen korvaajana
Ennen EnumSetiä ohjelmoijat käyttivät int-bittilippuja, kuten READ | WRITE. EnumSet korvaa tämän ratkaisun tyyppiturvallisemmalla ja selkeämmällä tavalla.
Saatte bittikenttien suorituskyvyn ilman virheille altista manuaalista maskausta.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Style { BOLD, ITALIC, UNDERLINE }
static void render(Set<Style> styles) {
System.out.println("Applying: " + styles);
}
public static void main(String[] args) {
render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
}
}Iterointi määrittelyjärjestyksessä
EnumSet iteroi vakiot niiden luontaisessa järjestyksessä, joka on niiden määrittelyjärjestys.
Tämä tuottaa ennakoitavan ja vakaan iterointijärjestyksen toisin kuin HashSet.
import java.util.EnumSet;
public class Main {
enum Phase { ALPHA, BETA, RC, GA }
public static void main(String[] args) {
EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
for (Phase p : set) System.out.println(p);
}
}Suojatut kopiot copyOf-metodilla
EnumSet.copyOf(collection) luo EnumSetin mistä tahansa enum-arvojen kokoelmasta. Sitä voi käyttää turvallisen kopion luomiseen tai Listin muuntamiseen.
import java.util.EnumSet;
import java.util.List;
public class Main {
enum Role { ADMIN, EDITOR, VIEWER }
public static void main(String[] args) {
List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
EnumSet<Role> roles = EnumSet.copyOf(source);
System.out.println(roles);
}
}Miksi se on nopea
EnumSet käyttää enintään 64 vakiota sisältävillä enum-tyypeillä bittivektorina yhtä long-arvoa. Jokainen operaatio vaatii vain yhden tai kaksi konekäskyä.
EnumSetiä kannattaa aina suosia enum-joukoissa HashSet<MyEnum>-tyypin sijaan.
import java.util.EnumSet;
public class Main {
enum Bit { B0, B1, B2, B3 }
public static void main(String[] args) {
EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
// contains is a single bit-and under the hood
System.out.println(s.contains(Bit.B2));
}
}Pikatesti
Testatkaa EnumSet-tietämystänne.
Kertaus
Opitte EnumSetistä:
- Enum-tyypeille tarkoitettu bittivektoriin perustuva
Set, joka on erittäin nopea ja tiivis. - Tehdasmetodit:
of,allOf,noneOf,range,complementOfjacopyOf. - Iterointi tapahtuu määrittelyjärjestyksessä.
- Se on tyyppiturvallinen korvaaja int-bittilipuille.
Seuraavaksi vastaava karttatyyppi: EnumMap.
import java.util.EnumSet;
public class Main {
enum X { A, B }
public static void main(String[] args) {
System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
}
}Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”EnumSet” ilmainen?
Kyllä – oppitunnin ”EnumSet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”EnumSet”?
Nopeat joukko-operaatiot enum-arvoille. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”EnumSet”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.