Какой вариант лучше для HashMap? - PullRequest
4 голосов
/ 08 февраля 2011

Какой вариант лучше использовать:

И почему?

Кроме того, что такое loadfactor и modcount в свойстве HashMap?

Когда я отлаживаю свой код в затмениипосмотрите на значение HashMap, оно показывает свойство с именем loadfactor со значением 0,75 и свойство с именем modcount со значением 3.


Где я использую hashmap вмой код: -

Я занимаюсь разработкой коммуникационного приложения, которое вы можете использовать, например, в чате.в котором я храню все отправленные / полученные сообщения в HashMap.Теперь, когда я не могу предположить, сколько сообщений будет отправлять / получать пользователь, я объявляю хэш-карту без начальной емкости.То, что я написал, это

Map<String, Map<String, List<String>>> usersMessagesMap = new HashMap<String, Map<String,List<String>>>();

, если я использую его с начальной емкостью 100 или выше, это повлияет на код?

Ответы [ 4 ]

8 голосов
/ 08 февраля 2011

Вы проверяли HashMap API Javadoc?

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

При слишком высоком начальном размере:

Для итерации по представлениям коллекции требуется время, пропорциональное «емкости» экземпляра HashMap (числоведра) плюс его размер (количество отображений ключ-значение). Таким образом, очень важно не устанавливать слишком высокую начальную емкость (или слишком низкий коэффициент загрузки), если производительность итерации важна.

Влияние коэффициента загрузки на производительность:

Как правило, коэффициент загрузки по умолчанию (.75) обеспечивает хороший компромисс между временными и пространственными затратами. Более высокие значения уменьшают накладные расходы на пространство, но увеличивают стоимость поиска (отражается в большинстве операций класса HashMap, включая get и put). Ожидаемое количество записей на карте и коэффициент загрузки должны учитываться при настройке ее начальной емкости, чтобы минимизировать количество операций перефразировки .Если начальная емкость превышает максимальное число записей, деленное на коэффициент загрузки, операции перефразирования никогда не будут выполняться.

Короче говоря: в зависимости от предполагаемого размера и ожидаемого коэффициента роста,вам придется выбрать приблизительное или противоположное.

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

4 голосов
/ 08 февраля 2011

Если вы знаете, что размер набора ключей будет намного больше, чем начальная емкость (, что составляет 16 ), я бы использовал более высокую начальную емкость для уменьшения перефразирования (по мере роста количества ключей и Значение N/C (где N - количество сохраненных ключей, а C - емкость карты) достигает коэффициента загрузки, массив карт расширяется, а ключи перефразируются). Кроме того, поскольку размер карты увеличивается в геометрической прогрессии, вы не увидите значительного уменьшения числа при перефразировании, если у вас не будет значительного количества клавиш.

Итак, мое мнение таково: если у вас есть запасная память и много ключей, перейдите на более высокую начальную емкость.

2 голосов
/ 08 февраля 2011
  • Лучше с точки зрения простоты, без начального размера.
  • Лучше с точки зрения производительности, попробуйте сами.

Найден поток SO, Производительность Hashmap с различной начальной емкостью и коэффициентом загрузки

Коэффициент загрузки

Производительность большинства столкновений Методы разрешения не зависят непосредственно на номер п хранится записи, но сильно зависит от коэффициент загрузки стола, соотношение н / с между n и размером s его ведра массив. Иногда это упоминается как коэффициент заполнения, как он представляет часть с ведра в структура, которая заполнена одним из п хранятся записи. С хорошим хешем функция, средняя стоимость поиска почти постоянный как коэффициент нагрузки увеличивается от 0 до 0,7 (около 2/3 полный) или около того. - Википедия по коэффициенту нагрузки

Теперь ваш новый вопрос

если я использую его с начальной емкостью 100 или выше это повлияет на код?

Это не очень хорошая идея, вы хорошо подходите по умолчанию. Не думайте слишком много об этом в начале. По его словам, «преждевременная оптимизация - корень всего зла». Это не принесет никакой реальной пользы.

1 голос
/ 08 февраля 2011

Строго говоря, вам не нужно заботиться о внутренних полях HashMap (loadfactor и modcount - это поля, а не свойства: свойства могут иметь методы получения / установки).

* modcountСкорее всего, это число изменений, примененных к Map с момента его создания.Он используется для обнаружения одновременных изменений и для определения, когда Iterator становится «сломанным» (потому что исходный Map был структурно изменен с момента его создания).

loadfactor, вероятно, поле, хранящееВторой аргумент конструктор с двумя аргументами .Он определяет, насколько «плотно упакованным» может быть внутренний массив до тех пор, пока он не будет изменен (что приводит к повторному хешированию всех ключей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...