Java Academy · Oppitunti

EnumSet

Nopeat joukko-operaatiot enum-arvoille.

Oppitunti 3/413 vaihetta

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, complementOf ja copyOf.
  • 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));
    }
}
Aloita maksutta

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.

Kaikki tämän kurssin oppitunnit

  1. Enumit kenttien ja metodien kanssa
  2. Abstraktit metodit enumeissa
  3. EnumSet
  4. EnumMap
← Takaisin: Java Academy