Разница между ArrayList.TrimToSize() и массивом?
Обычно говорят, что мы перешли из Array в ArrayList по следующей причине
Массивы имеют фиксированный размер, а списки массивов - нет.
Одним из недостатков ArrayList является:
Когда он достигает своей емкости, ArrayList становится 3/2 его фактического размера. В результате память может быть потрачена впустую, если мы не используем пространство должным образом. В этом случае предпочтительны массивы.
Если мы используем ArrayList.TrimSize(), сделает ли Array List единодушным выбором? Исключить единственное преимущество (фиксированный размер) над массивом?
2 ответа
Если вы разрабатываете крайне критически важное для памяти приложение, вам также необходимо изменить размер и можно снизить производительность, тогда список обрезки массивов - ваш лучший выбор. Это единственный раз, список массивов с обрезкой будет единодушным выбором.
В других ситуациях, что вы на самом деле делаете:
- Вы создали список массивов. Емкость списка по умолчанию составляет 10.
- Добавлен элемент и применена операция обрезки. Таким образом, размер и емкость теперь равны 1. Как работает размер отделки? Он в основном создает новый массив с фактическим размером списка и копирует старые данные массива в новый массив. Старый массив оставлен для сбора мусора.
- Вы снова добавили новый элемент. Поскольку список полон, он будет перераспределен с более чем 50% пробелов. Снова, процедура, подобная 2, будет следовать.
- Вы снова вызываете TrimSize, и он следует той же процедуре, что и 2.
- Вещи повторяются...
Итак, вы видите, мы несем большие потери производительности, чтобы сохранить емкость и размер списка одинаковыми. Фиксированный размер не предлагает вам ничего выгодного, кроме экономии нескольких дополнительных мест, что вряд ли является проблемой для современных машин.
Короче говоря, если вы хотите изменить размер без написания большого количества стандартного кода, то список массивов является единодушным выбором. Но если размер никогда не меняется и вам не нужны никакие динамические функции, такие как операция удаления, тогда лучше выбрать массив. Несколько лишних байтов вряд ли проблема.
Один короткий ответ будет следующим: trimToSize не решает все, потому что сжатие массива после его роста - это не то же самое, что предотвращение роста в первую очередь; первый имеет стоимость копирования + сборка мусора.
Более длинный ответ: int[] - низкий уровень, ArrayList - высокий уровень, что означает, что он более удобен, но дает вам меньше контроля над деталями. Таким образом, в коде, ориентированном на бизнес (например, манипулирование коротким списком "продуктов"), я предпочитаю ArrayList, чтобы я мог забыть о технических деталях и сосредоточиться на бизнесе. В математически ориентированном коде я, вероятно, пойду за int[].
Есть дополнительные тонкие различия, но я не уверен, насколько они важны для вас. Например, параллелизм: если вы измените данные ArrayList из нескольких потоков одновременно, они намеренно потерпят неудачу, потому что это интуитивное требование для большинства бизнес-кода. Int [] позволит вам делать все, что вы захотите, оставив на ваше усмотрение, чтобы убедиться, что это имеет смысл. Опять же, все это можно охарактеризовать как "низкий уровень"...