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?