Метод hashCode() в классе Enum является окончательным и определяется как super.hashCode(), что означает, что он возвращает число, основанное на адресе экземпляра, который является случайным числом от программистов POV.
Определение его, например. поскольку ordinal() ^ getClass().getName().hashCode()
будет детерминированным для разных JVM. Это даже улучшилось бы, так как наименее значимые биты "как можно больше менялись", например, для перечисления, содержащего до 16 элементов и HashMap размером 16, не было бы никаких столкновений (конечно, использование EnumMap лучше, но иногда невозможно, например, нет ConcurrentEnumMap). С текущим определением у вас нет такой гарантии, не так ли?
Резюме ответов
Использование Object.hashCode()
сравнивается с более приятным хэш-кодом, как показано выше:
- ПРОФИ
- Простота
- контрас
- скорость
- больше коллизий (для любого размера HashMap)
- недетерминизм, который распространяется на другие объекты, делая их непригодными для
- детерминированные симуляции
- Расчет ETag
- поиск ошибок в зависимости, например. по порядку итерации
HashSet
Я лично предпочел бы более приятный hashCode, но IMHO не имеет большой вес, возможно, за исключением скорости.
UPDATE
Мне было интересно узнать скорость и написал benchmark с удивительным результаты. По цене одного поля за класс вы можете детерминировать хэш-код, который почти в четыре раза быстрее. Хранение хеш-кода в каждом поле будет еще быстрее, хотя и пренебрежимо.
Объяснение, почему стандартный хэш-код не намного быстрее, заключается в том, что он не может быть адресом объекта, поскольку объекты передаются GC.
ОБНОВЛЕНИЕ 2
Есть некоторые странные вещи с показателем hashCode
в целом. Когда я их понимаю, все еще остается открытым вопрос, почему System.identityHashCode
(чтение из заголовка объекта) работает медленнее, чем доступ к нормальному объекту.