работает - коллекции java пример




Выбор начальной емкости HashSet с ожидаемым количеством уникальных значений и вставок (5)

Безопасная ставка - это слишком маленький размер.

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

Коэффициент загрузки является сложным. Я предлагаю оставить его по умолчанию. Я понимаю: ниже 0.70f вы делаете массив слишком большим и, следовательно, медленнее. Выше 0.80f, и вы начнете получать много ключевых столкновений. Предположительно, для алгоритмов зондирования потребуются более низкие коэффициенты нагрузки, чем алгоритмы ковша.

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

Хорошо, вот моя ситуация:

У меня есть Array of States, который может содержать дубликаты. Чтобы избавиться от дубликатов, я могу добавить их в набор.

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

Из googling я придумал:

String[] allStates = getAllStates();
Set<String> uniqueStates = new HashSet<String>(allStates.length, 0.75);

Проблема в том, что allStates может содержать где-то между 1 и 5000 состояниями. Таким образом, набор будет иметь емкость более 5000, но будет содержать не более 50.

Таким образом, в качестве альтернативы установить максимальный размер набора можно установить как максимальное количество состояний, а коэффициент нагрузки - 1.

Наверное, мои вопросы:

  • Какой должна быть начальная емкость, когда вы не знаете, сколько элементов должно быть в Set?
  • Действительно ли имеет значение то, что он получает, когда он может содержать максимум 50?
  • Должен ли я даже беспокоиться об этом?

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


Сделайте хорошее предположение. Нет жесткого правила. Если вы знаете, что, вероятно, будут говорить 10-20 состояний, я бы начал с этого числа (20).


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


Во-первых, я скажу, что в вашем случае вы определенно переусердствовали. Однако есть, вероятно, ситуации, когда нужно было бы исправить это. Итак, вот что я понимаю:

1) Количество элементов, которые вы можете удерживать в своем HashSet = начальный коэффициент загрузки x. Поэтому, если вы хотите удержать n элементов, вам нужно сделать то, что сделал Zarkonnen , и делить n на коэффициент загрузки.

2) Под обложками начальная емкость округляется до двух уровней на один учебник Oracle .

3) Коэффициент нагрузки должен быть не более 0,80 для предотвращения чрезмерных столкновений, как отметил Тома Хотин - линия .

Если вы просто принимаете значения по умолчанию (начальная емкость = 16, коэффициент загрузки = .75), вы в итоге удвоите свой набор в размере 3 раза. (Начальный максимальный размер = 12, первое увеличение составляет 32 и максимальный размер 24 (32 * .75), второе увеличение составляет 64 и максимальный размер 48 (64 * .75), третье увеличение составляет 128 и максимальный размер 96 (128 * .75).)

Чтобы увеличить максимальный размер до 50, но при этом установите как можно меньший набор, рассмотрите начальную емкость 64 (мощность 2) и коэффициент загрузки 0,79 или более. 64 * .79 = 50,56, поэтому вы можете получить все 50 штатов. Указание 32 <начальная емкость <64 приведет к округлению начальной емкости до 64, так что это то же самое, что и указание 64 спереди. Задание начальной емкости <= 32 приведет к увеличению размера. Использование коэффициента загрузки <.79 также приведет к увеличению размера, если ваша начальная емкость> 64.

Поэтому моя рекомендация - указать начальную емкость = 64 и коэффициент загрузки = .79.







set