Warum ist ein EnumSet oder eine EnumMap wahrscheinlich leistungsfähiger als ihre Hash-Gegenstücke?

8

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?

    
Geek 26.01.2013, 11:53
quelle

1 Antwort

14

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.

    
Tomasz Nurkiewicz 26.01.2013, 11:57
quelle

Tags und Links