ArrayList Эффективность и размер - PullRequest
9 голосов
/ 07 июня 2011

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

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

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

Спасибо

Ответы [ 7 ]

10 голосов
/ 07 июня 2011

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

ArrayList myList = new ArrayList(150);

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

5 голосов
/ 07 июня 2011

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

2 голосов
/ 07 июня 2011

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

2 голосов
/ 07 июня 2011

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

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

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

Почему 150?Почему бы не 120?

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

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

1 голос
/ 07 июня 2011

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

Вот этот javadoc

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

1 голос
/ 07 июня 2011

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

1 голос
/ 07 июня 2011

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

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