HashMap и HashSet очень похожи. Фактически, второй содержит экземпляр первого.
HashMap содержит массив блоков, чтобы содержать его записи. Размер массива всегда равен степени 2. Если вы не укажете другое значение, изначально есть 16 сегментов.
Когда вы помещаете в него запись (ключ и значение), она решает, куда будет вставлена запись, вычисляя ее по хеш-коду ее ключа ( хеш-код не является адресом памяти, и хеш-код не является модуль ). Разные записи могут сталкиваться в одном и том же сегменте, поэтому они будут помещены в список.
Записи будут вставлены до достижения коэффициента загрузки. Этот коэффициент по умолчанию равен 0,75 , и его не рекомендуется менять, если вы не очень уверены в том, что делаете. 0,75 в качестве коэффициента загрузки означает, что HashMap из 16 сегментов может содержать только 12 записей ( 16 * 0,75 ). Затем будет создан массив блоков, удваивающий размер предыдущего. Все записи будут снова помещены в новый массив. Этот процесс известен как перефразировка и может быть дорогим.
Поэтому, если вы знаете, сколько записей будет вставлено, рекомендуется создать HashMap, указав его окончательный размер:
new HashMap(finalSize);