Объявление емкости списка в Java - PullRequest
5 голосов
/ 25 мая 2011

Я часто использую списки в своих приложениях для Android. Прямо сейчас я создаю страницу в Твиттере, которая содержит максимум 50 «твитов» пользователя.

У меня есть список, определенный следующим образом:

List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);

Где Tweet - это пользовательский тип объекта, содержащий информацию об обновлении в Твиттере (текст, дата, имя пользователя и т. Д.), А MAX_TWEETS - это постоянное целочисленное значение (50).

Вопросы:

Какая польза от установки начальной емкости этого List, если таковая имеется?

Стоит ли настраивать емкость, когда я знаю, что мой список будет таким маленьким? Когда я должен / не должен устанавливать емкость?

Ответы [ 8 ]

3 голосов
/ 25 мая 2011

По умолчанию в Java 6 размер List равен 10. То есть система создает десять слотов памяти в базовом массиве. Если вы попытаетесь добавить 11-й элемент, будет создана только копия массива. Предоставление размера улучшает производительность.

3 голосов
/ 25 мая 2011

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

Объем памяти в Списке, который вырос и может иметь резервный массив, превышающий количество сохраненных элементов, можно уменьшить, вызвав trimToSize()

2 голосов
/ 25 мая 2011

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

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

2 голосов
/ 25 мая 2011

Емкость ArrayList по умолчанию установлена ​​в 10 (см. Jdk 1.6 source).Это означает, что массив размером 10 будет выделен при создании.Если вы добавите элемент номер 11, емкость увеличится до 16. Затем снова увеличьте, как только вы достигнете 21.

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

На самом деле это правильная формула увеличения размера:

int newCapacity = (oldCapacity * 3)/2 + 1;
2 голосов
/ 25 мая 2011

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

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

2 голосов
/ 25 мая 2011

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

2 голосов
/ 25 мая 2011

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

пример: вы установили список на 25, а по умолчанию - 10?(не уверен на 100%), если вы добавите 24 элемента, список вообще не будет расти.если вы оставите значение по умолчанию, оно будет расти.

надеюсь, это поможет

2 голосов
/ 25 мая 2011

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

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

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