Эффективность и размер ArrayList

Я хочу прояснить кое-что: При использовании arraylist он начинается с размера 10 элементов. Если ему нужно автоматически увеличить, он переписывает весь arrayList на 2/3 больше.

Если я смотрю на список, который в конечном итоге будет размером 50-120, лучше ли:

  1. создать ее размер 150 сразу и иметь много неиспользуемого пространства
  2. разрешить автоматическое увеличение списка несколько раз?

спасибо

7 ответов


Если вы знаете вероятное размере ArrayList, обычно лучше указать его заранее:

ArrayList myList = new ArrayList(150);

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


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


да, указание размера перед рукой лучше, из-за автоматического размера. Чем больше ArrayList получает тем больше, что он должен изменить размер.


он переписывает весь arrayList на 2/3 больше

нет. Это делает массив два раза как большой (хотя точный фактор является недокументированной деталью реализации). Я исправлюсь.

Если я смотрю на список, который в конечном итоге будет размером 50-120, лучше ли: 1. создать его размер 150 сразу

почему 150? Почему не 120?

  1. разрешить список автоматически увеличился в несколько раз?

в таком небольшом диапазоне я бы сразу использовал большой размер. Если диапазон был намного больше (например, 50-50000), я бы зарезервировал наименьший размер (или, возможно, промежуточный размер, в зависимости от ожидаемого распределения значений) и позволил ему изменить размер несколько раз.


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


пока вы не планируете создавать миллионы этих списков,это не имеет значения. Копирование данных массива происходит довольно быстро, и увеличение размера до 50-120 элементов не будет измеряться с помощью профилировщика. Однако, если вы знаете, что список наконец-то появится этот размер, я бы рекомендовал использовать эту информацию при создании списка.


вы также можете использовать хороший метод из Guava списки.newArrayListWithExpectedSize.

вот javadoc

создает экземпляр ArrayList соответствующего размера для хранения расчетного количества элементов без изменения размера. В случае низкой оценки добавляется небольшое количество отступов.