Если ключи, которые я хочу использовать, гарантированно являются уникальными (или, по крайней мере, можно предположить, что ключи уникальны), использование «vanilla» ConcurrentHashMap обеспечивает лучшую производительность,
Обычно вы используете ConcurrentHashMap
, если Map
является потенциальным узким местом параллелизма.Если ваше приложение однопоточное или нет конфликтов, ConcurrentHashMap
медленнее, чем HashMap
.
, или необходимо изменить функцию хеширования или метод put, чтобы избежать ненужного хеширования?
Хеш-функция вычисляется один раз за «зонд» хеш-таблицы;например, один раз за get
или put
операцию.Вы можете уменьшить стоимость хэш-функции, кэшируя результат, но это потребует дополнительных 4 байтов памяти для каждого ключевого объекта.Является ли кэширование полезной оптимизацией, зависит от:
- , какова относительная стоимость хеширования по сравнению с остальной частью приложения, и
- доля вызовов на
hashCode()
, которая будетфактически используют кэшированное значение.
Оба эти фактора сильно зависят от приложения.
(Кстати, долгосрочные затраты на использование хеш-кода идентификатора в качестве значения хеш-функции также дополнительные 4 байта памяти.)
Кроме того, имеет ли числовой ключ какое-либо преимущество в производительности по сравнению с нечисловым ключом (таким как String или POJO с правильным хешированиемfunction)?
Хеш-функция, вероятно, будет дешевле в числовом случае, но стоит ли она того, зависит от того, есть ли недостатки использования числовой клавиши для конкретного приложения.И, как указано выше, относительные затраты являются особенностями применения.Например, стоимость String.hashCode()
пропорциональна длине хешируемой строки.