Почему изменение размера осуществляется так, как оно есть?
У меня есть несколько вопросов о перестройке HashMaps
при добавлении пары новых значений. Я задам вопросы на основе этих фактов (они верны для JVM Oracle, не уверены, являются ли они правильными для других JVM):
- Resize rebuilds
HashMap
будет иметь больший массив внутренних таблиц каждый раз, когда вы увеличиваете HashMap больше порога (threshold = loadFactor * numberOfEntries). Не имеет значения, в каком ковке добавляется вновь созданная запись - Карта все равно будет больше. Даже если все записи переходят в одно ведро (т.е. Их ключи hashCode()
возвращают одинаковый номер).
-
HashMap
не уменьшается при удалении данных. Даже если все ключи удалены из HashMap
, внутренний размер таблицы не изменяется.
Теперь вопросы:
Если они есть, то:
- Почему изменение размера реализовано таким образом? Является ли намерение выращивать внутренний стол, даже если он явно не нужен? Или ошибка?
- Почему он не сокращается?
Ответы
Ответ 1
Да, эти факты верны.
- Обнаружение того, является ли это "явно не необходимым", занимает много времени, и это почти всегда избыточно, поскольку случай, когда все ключи имеют один и тот же хэш-код, встречается редко. Короче говоря, вы платите значительные расходы (отслеживая, как распространен один конкретный хеш-код) для всех, чтобы просто сохранить некоторую работу в крайне редком случае, что в итоге будет стоить больше, чем экономит.
- Поскольку удаление является несколько менее обычной операцией, и обычно за ней следует заправка карты. Если вы хотите запустить карту с помощью таблицы меньшего размера, вы можете просто назначить ее
new HashMap
, и пусть старый будет собран с помощью мусора.