Подтвердить что ты не робот

Почему изменение размера осуществляется так, как оно есть?

У меня есть несколько вопросов о перестройке HashMaps при добавлении пары новых значений. Я задам вопросы на основе этих фактов (они верны для JVM Oracle, не уверены, являются ли они правильными для других JVM):

  • Resize rebuilds HashMap будет иметь больший массив внутренних таблиц каждый раз, когда вы увеличиваете HashMap больше порога (threshold = loadFactor * numberOfEntries). Не имеет значения, в каком ковке добавляется вновь созданная запись - Карта все равно будет больше. Даже если все записи переходят в одно ведро (т.е. Их ключи hashCode() возвращают одинаковый номер).
  • HashMap не уменьшается при удалении данных. Даже если все ключи удалены из HashMap, внутренний размер таблицы не изменяется.

Теперь вопросы:

  • Правильны ли эти факты?

Если они есть, то:

  1. Почему изменение размера реализовано таким образом? Является ли намерение выращивать внутренний стол, даже если он явно не нужен? Или ошибка?
  2. Почему он не сокращается?
4b9b3361

Ответ 1

Да, эти факты верны.

  • Обнаружение того, является ли это "явно не необходимым", занимает много времени, и это почти всегда избыточно, поскольку случай, когда все ключи имеют один и тот же хэш-код, встречается редко. Короче говоря, вы платите значительные расходы (отслеживая, как распространен один конкретный хеш-код) для всех, чтобы просто сохранить некоторую работу в крайне редком случае, что в итоге будет стоить больше, чем экономит.
  • Поскольку удаление является несколько менее обычной операцией, и обычно за ней следует заправка карты. Если вы хотите запустить карту с помощью таблицы меньшего размера, вы можете просто назначить ее new HashMap, и пусть старый будет собран с помощью мусора.