Являются ли EnumMaps в Java идеальными хэш-картами?
Если список ключей хеш-функции для хэш-функции известен и неизменен, можно создать идеальную хэш-функцию. Enum в Java - это список известных и неизменных элементов. Поэтому должна быть возможность реализовать EnumMap как идеальный хеш. Это в настоящее время (1.7) сделано в Java?
4 ответа
Нет. EnumMap
не использует хеширование Он использует enum
порядковые значения как индексы в массиве типа значения.
Ссылка:
- http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/EnumMap.java#EnumMap.getKeyUniverse%28java.lang.Class%29. (Если эта ссылка не работает, Google для "источник java.util.EnumMap".)
EnumMap
это не какой-то HashMap
что бы использовать хеширование внутри put
а также get
данные. Оно использует Array
хранить <K, V>
пара где K
является Enumeration constant
и использует ordinal value
(положение Enumeration constant
в декларации Enum
, известен как порядковый номер) внутри put
или же get
данные. Enum.ordinal метод используется для получения ordinal value
данного Enumeration constant
,
Другими словами, EnumMap
не использует хеширование, а порядковые значения Enumeration constant
в качестве индекса put
или же get
<K, V>
пара во внутреннем array
,
Вы можете проверить исходный код EnumMap.put для уверенности в себе!
Ссылка, которую вы называете "EnumHashMap", фактически указывает на класс с именем "EnumMap", там нет никаких хэшей:
Enum карты представлены внутри как массивы. Это представление чрезвычайно компактно и эффективно
В качестве аргумента можно утверждать, что отображение значений enum на целое число (как индекс в вышеупомянутом массиве) является хэш-функцией, и да, это идеально, так как нет коллизий.
EnumMap не основан на хэше, он основан на массивах
частный переходный процесс K[] keyUniverse; ... частный переходный объект [] vals;