Почему размер hashmap уменьшается в Java

HashMap<String, Integer> hashMap = new HashMap<String, Integer>(4, 0.75f);
System.out.println(hashMap.size()); // 0
hashMap.put("a", 1);
System.out.println(hashMap.size()); // 1
hashMap.remove("a");
System.out.println(hashMap.size()); // 0

OpenJDK 14.0.1 Почему при создании мапы с указанным начальным размером 4, размер ее равен 0? И почему при удалении элемента размер мапы уменьшается? Это какое-то нововведение в какой-то Jav`e? И вообще по умолчанию размер должен же быть равен 16.


Ответы (2 шт):

Автор решения: Circassian

У HashMap есть поле threshold — предельное количество элементов, при достижении которого размер хэш-таблицы увеличивается вдвое. Рассчитывается по формуле (capacity * loadFactor)

loadFactor — этот параметр отвечает за то, при какой степени загруженности текущей хеш-таблицы необходимо создавать новую хеш-таблицу, т.е. как только хеш-таблица заполнилась на 75%, будет создана новая хеш-таблица с перемещением в неё текущих элементов (затратная операция, так как требуется перехеширование всех элементов);

Т.е. при инициализации размер остается равным 0 и увеличивается только при добавлении новых элементов.

→ Ссылка
Автор решения: Roman Konoval

Нужно различать вместимость (capacity) и размер (size).

Значение 4 указываемое в конструкторе, это не размер таблицы, а вместимость, т.е. количество памяти заранее выделенное под хранение элементов.

size же возвращает, количество элементов, которые хранится в конкретный момент времени.

→ Ссылка