with values type mkyong example enum define java enums enumset enum-map

java - values - ¿Por qué es probable que EnumSet o EnumMap sean más eficientes que sus contrapartes hash?



java enum string (1)

EnumSet está respaldado por una matriz de bits. Dado que la cantidad de elementos diferentes que puede poner en EnumSet se conoce de antemano, simplemente podemos reservar un bit para cada valor enum. Puede imaginar una optimización similar para Set<Byte> o Set<Short> , pero no es factible para Set<Integer> (necesitaría 0.5 GiB de memoria para 2 ^ 32 bits) o en general.

Por lo tanto, operaciones básicas como exists o add ar constant time (como HashSet ) pero simplemente necesitan examinar o establecer un bit. Sin hashCode() . Es por eso que EnumSet es más rápido. También operaciones más complejas como unión o implementadas fácilmente usando técnicas de manipulación de bits.

En OpenJDK hay dos implementaciones de EnumSet : RegularEnumSet capaz de manejar enum con hasta 64 valores en long y JumboEnumSet para enums más grandes (usando long[] ). Pero es solo un detalle de implementación.

EnumMap funciona con principios similares, pero usa Object[] para almacenar valores mientras que key (index) se deduce implícitamente de Enum.ordinal() .

Lo siguiente es de la sección Nota de Implementación del documento Java de EnumMap :

Nota de implementación: todas las operaciones básicas se ejecutan en tiempo constante. Es probable (aunque no garantizado) que sea más rápido que sus contrapartes de HashMap.

También he visto una línea similar en el documento de Java para EnumSet . Quiero saber por qué es más probable que EnumSets y EnumMaps sean más rápidos que sus contrapartes hash?