Что более «дорого»: создание слишком большого ArrayList или увеличение ArrayList? - PullRequest
3 голосов
/ 27 марта 2012

У меня есть существующий ArrayList, который будет отфильтрован по определенным критериям.Я использую Apache CollectionUtils.select(Collection, Predicate, Collection) для фильтрации.

Вторая коллекция, переданная этому методу, будет заполнена соответствующими объектами.Теперь разумнее создать эту новую коллекцию с

List newList = new ArrayList();

или с

List newList = new ArrayList(listToBeFiltered.size());

?

В первом случае List будет увеличенесли первоначальная емкость достигнута, тогда как во втором случае иногда создается слишком большой List.

Какой путь лучше?И, пожалуйста, поправьте меня, если я допустил какие-либо ошибки в своем объяснении.

Ответы [ 4 ]

1 голос
/ 27 марта 2012

Если вы обладаете какой-либо интуицией в отношении избирательности вашей фильтрации, вы можете изменить размер списка немного больше его ожидаемого размера. Если селективность обычно составляет 20%, то вы можете установить конечный результат, скажем, 25%.

 List newList = new ArrayList((int) (0.25 * listToBeFiltered.size()));
1 голос
/ 27 марта 2012

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

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

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

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

0 голосов
/ 27 марта 2012

Зависит, у вас есть шанс тратить некоторое пространство на обоих.

Но, если вы думаете, что результирующий массив будет намного меньше входного, я предлагаю вам использовать List newList = new ArrayList ();

Начальная емкость Arraylist равна 10, а размер удваивается, если он заполнен.

0 голосов
/ 27 марта 2012

В большинстве случаев «увеличение» будет более дорогостоящим, поскольку каждый раз, когда ему нужно освободить место, он будет оштрафован.Для добавления большого количества записей это приведет к небольшим задержкам во время выполнения.Выделение большого размера для начала влечет за собой штраф только один раз, при условии, что в дальнейшем вы не добавите больше предметов.Обратите внимание, однако, что динамические массивы / списки / контейнеры обычно имеют гранулярность, которая дает разумную емкость, прежде чем им придется перераспределять память, поэтому для небольшого количества элементов вы можете не заметить никакой разницы.

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