Das Folgende stammt aus dem Implementierungshinweis von Java-Dokument von EnumMap :
Implementierungshinweis: Alle grundlegenden Operationen werden in konstanter Zeit ausgeführt. Sie sind wahrscheinlich (obwohl nicht garantiert) schneller als ihre HashMap-Gegenstücke.
Ich habe eine ähnliche Zeile im Java-Dokument für EnumSet
gesehen. Ich möchte wissen, warum es wahrscheinlicher ist, dass EnumSets
und EnumMaps
schneller sind als ihre gehashten Gegenstücke?
EnumSet
wird von einem Bit-Array unterstützt. Da die Anzahl der verschiedenen Elemente, die Sie in EnumSet
eingeben können, im Voraus bekannt ist, können wir einfach ein Bit für jeden Aufzählungswert reservieren. Sie können sich eine ähnliche Optimierung für Set<Byte>
oder Set<Short>
vorstellen, aber es ist nicht möglich für Set<Integer>
(Sie benötigen 0,5 GiB Speicher für 2 ^ 32 Bits) oder allgemein.
So grundlegende Operationen wie exists
oder add
sind konstante Zeit (genau wie HashSet
), aber sie müssen nur ein Bit untersuchen oder setzen. Keine hashCode()
Berechnung. Deshalb ist EnumSet
schneller. Auch komplexere Operationen wie die Vereinigung oder einfach implementiert mit Bit-Manipulationstechniken.
In OpenJDK gibt es zwei Implementierungen von EnumSet
: RegularEnumSet
, die enum mit bis zu 64 Werten verarbeiten können in long
und JumboEnumSet
für größere Enums (mit long[]
). Aber es ist nur ein Implementierungsdetail.
EnumMap
funktioniert nach ähnlichen Prinzipien, verwendet jedoch Object[]
zum Speichern von Werten, während key (index) implizit von Enum.ordinal()
abgeleitet wird.