2013-11-20 5 views
0

согласно моему пониманию, и то, что я прочиталКарта, как карта растет

коэффициент нагрузки является мерой того, насколько полно хэш-таблицы разрешено получить, прежде чем его емкость автоматически увеличивается

Таким образом, при нагрузке 0,8 (80%), с размером карты 10, Map будет расти на 10 размерах, когда 8 элементов помещаются в Map.

Итак, сейчас Map имеет размер 20. Мое сомнение в том, что следующее 10-элементное пространство будет добавлено к Map.

  • когда Map снова 80% полной, то есть, когда 16 элементов помещаются в Map.

или

  • Когда 18 элементов помещаются в Map.

ответ

1

Это будет 16. Если вы посмотрите на код Java для HashMap:

threshold = (int)(newCapacity * loadFactor); 

где новые мощности является новый размер. Поэтому предел в вашем примере будет 16.

1

Loadfactor 80%, поэтому 16 элементов. Он рассчитает изменение размера в зависимости от общего количества элементов, которые находятся там, и максимальной емкости в это время.

Он не отслеживает последнее изменение размера.

1

A HashMap имеет size() и capacity, и это две разные вещи. Емкость является внутренним размером хэш-таблицы и всегда равна мощности, поэтому HashMap не может иметь емкость 20. Размер - это количество записей хэша, которые были помещены пользователем на эту карту.

Когда вы объявляете HashMap

Map map = new HashMap(20) 

Это фактическая мощность составляет 32 и пороговое значение равно 24. Размер Это равен нулю.

Map map = new HashMap() 

Для этого случая карта имеет размер 0 и емкость по умолчанию 16.

Порог:

threshold = (int)(newCapacity * loadFactor) = 32 * 0.8 = 25; 

Который является 25 для коэффициента нагрузки 0.8. Таким образом, как только ваша карта достигнет размера в 25 записей, она будет изменена до емкости 64, содержащей те же 25 записей.

0

Каждый раз, когда происходит изменение размера карты, порог пересчитывается как;

threshold = (int)(newCapacity * loadFactor); 

Таким образом, в вашем примере, это будет 16.

Пожалуйста, обратитесь источник HashMap here.

Смежные вопросы