Параметры инициализации HashMap (загружаются / initialcapacity),

Простым способом было бы использовать фреймворк PHP, такой как CodeIgniter или Laravel , которые имеют встроенные функции, такие как фильтрация и активная запись, так что вам не нужно беспокоиться об этих нюансах.

36
задан Tom11 1 March 2016 в 09:01
поделиться

7 ответов

Относительно коэффициента загрузки я просто заключу в кавычки из HashMap javadoc:

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

Значение, коэффициент загрузки не должен быть изменен от .75, если у Вас нет некоторой определенной оптимизации, Вы собираетесь сделать. Начальная способность является единственной вещью, Вы хотите изменить, и установить его согласно Вашему N значение - значение (N / 0.75) + 1, или что-то в той области. Это гарантирует, что таблица всегда будет достаточно большой, и никакое перефразирование не произойдет.

37
ответ дан Yuval Adam 27 November 2019 в 05:34
поделиться

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

HashMap<Foo> myMap = new HashMap<Foo>(numberOfElements * 2);

, Не стесняются не соглашаться, на самом деле я вполне хотел бы проверить эту идею или выведенный.

5
ответ дан Zarkonnen 27 November 2019 в 05:34
поделиться

В ArrayList, эффективное число является N (N, уже предполагает, что будущее растет).

Erm, нет который это не делает, если я не неправильно понимаю то, что Вы говорите здесь. При передаче целого числа в конструктора Arraylist оно создаст основной массив точно того размера. Если окажется необходимостью даже в единственном дополнительном элементе то ArrayList должен будет изменить размеры основного массива, когда Вы затем будете звонить, добавляют (), заставляя этот вызов взять намного дольше, чем это обычно было бы.

, Если, с другой стороны, Вы говорите о своем значении N принятие во внимание роста - тогда да, если можно гарантировать, значение никогда не будет выходить за предел этого, тогда вызов такого конструктора Arraylist является соответствующим. И в этом случае, как указано Hank, аналогичный конструктор для карты был бы N и 1.0f. Это должно работать обоснованно, даже если Вы, действительно оказывается, превышаете N (хотя, если Вы ожидаете, что это произойдет регулярно, можно хотеть передать в большем числе для начального размера).

коэффициент загрузки, в случае, если Вы не знали, является точкой, в которой карте увеличат ее способность как часть общей мощности.

Редактирование : Yuval, вероятно, прав, что это - лучшая идея оставить коэффициент загрузки приблизительно 0,75 для карты общего назначения. Коэффициент загрузки 1,0 работал бы блестяще, если бы Ваши ключи имели последовательные хэш-коды (такие как последовательные целочисленные ключи), но для чего-либо еще Вы, вероятно, столкнетесь с коллизиями с блоками хеша, подразумевая, что поиски занимают больше времени у некоторых элементов. Создание большего количества блоков, чем строго необходимо, уменьшит этот шанс коллизии, означая, что существует больше шанса элементов, находящихся в их собственных блоках и таким образом являющихся восстановимым за самое короткое количество времени. Как в документах говорится, это - время по сравнению с компромиссом пространства. Если любой особенно важен для Вас (как показано профилировщиком вместо преждевременной оптимизации!) можно подчеркнуть это; иначе, палка со значением по умолчанию.

1
ответ дан Andrzej Doyle 27 November 2019 в 05:34
поделиться

Что касается HashMap исходный код поможет.

, Если количество записей достигает порога (способность * коэффициент загрузки), перефразирование сделано автоматически. Это означает, что слишком небольшой коэффициент загрузки может подвергнуться частому перефразированию, когда записи растут.

1
ответ дан grayger 27 November 2019 в 05:34
поделиться

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

CollectionSpy ( ] collectionspy.com ) - это новый профилировщик Java, который позволяет вам в мгновение ока увидеть, какие HashMaps близки к необходимости повторного хеширования, сколько раз они пересматривались в прошлом и многое другое. Идеальный инструмент для определения безопасных аргументов начальной емкости для конструкторов контейнеров на основе емкости.

0
ответ дан 27 November 2019 в 05:34
поделиться

Ответ Юваля верен только для Hashtable. HashMap использует два ведра, поэтому для HashMap Zarkonnen действительно подходит. Вы можете убедиться в этом в исходном коде:

  // Find a power of 2 >= initialCapacity
  int capacity = 1;
  while (capacity < initialCapacity)
  capacity <<= 1;

Итак, хотя коэффициент загрузки 0,75f остается таким же для Hashtable и HashMap, вы должны использовать начальную емкость n * 2, где n - количество элементов, которые вы планируете хранить. в HashMap. Это обеспечит максимальную скорость получения / ввода.

3
ответ дан 27 November 2019 в 05:34
поделиться

Это безопасно в большинстве случаев инициализации List и Map для создания списка List или Map со следующими параметрами размера.

List<T>(numElements + (numElements / 2));
Map<T,T>(numElements + (numElements / 2));

это соответствует правилу .75 , а также позволяет сэкономить небольшие накладные расходы по сравнению с операцией * 2 , описанной выше.

1
ответ дан 27 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: