Поскольку я вижу его, преимущества списка по массиву довольно очевидны:
List<Integer>, List<? extends Number>, List<? super Integer>
.addAll
, remove
и т.д. В то время как для массивов все стандартные операции кроме получают/устанавливают, должен быть выполнен способом процедуры путем передачи его статическому методу.ArrayList
, LinkedList
, unmodifieable и синхронизируемые списки, которые могут быть скрыты под общим интерфейсом List.Как недостатки я могу только упомянуть отсутствие синтаксического сахара и проверки типа выполнения. В то же время поддержка обеих структур требует частого использования asList
и toArray
методы, который делает код менее читаемым. Таким образом, мне любопытно, если существуют какие-либо важные преимущества использования массивов, которые я пропускаю.
Массивы более эффективны как с точки зрения времени обработки, так и с точки зрения объема памяти. Это особенно применимо, если вы работаете с примитивными типами, такими как int
или long
, поскольку List
требует, чтобы все элементы были заключены в объект Object
(например, Целое
или Длинное
). Хотя функции автобокса, представленные в Java 5, сокращают объем кода, необходимого для такой упаковки и развертывания, она не устраняет проблем с производительностью, поскольку объекты оболочки все еще создаются.
Однако большинство приложений, вероятно, не имеют узких мест в производительности, связанных с этими проблемами, поэтому в большинстве случаев подойдут List
и другие коллекции. В этих случаях простота программирования перевешивает увеличение использования памяти или ЦП, и List
является правильным выбором.
Скорость.Коллекции несколько медленнее, чем простые массивы: большинство из них по-прежнему используют массивы, но имеют дополнительные слои кода вокруг них. Конечно, если у вас нет особой потребности в дополнительной производительности, вы все равно должны использовать коллекции.
Еще одно небольшое преимущество массивов состоит в том, что может быть проще вызывать вариативные методы с массивами. Однако это никогда не должно быть основной причиной выбирать одно перед другим.
В дополнение к другим ответам, есть одно тонкое свойство массивов, которое можно рассматривать как преимущество перед списками. Это можно проиллюстрировать следующим кодом:
//This works
Integer[] ints = new Integer[4];
Number[] nums = ints;
//This doesn't work
List<Integer> intList = new ArrayList<Integer>();
List<Number> numList = intList; //Does not compile
List<Number> numList2 = (List<Number>)intList; //Does not compile either
В то время как массив подкласса ЯВЛЯЕТСЯ массивом суперкласса, списки подклассов НЕ являются списками суперклассов (и для этого есть веская причина - дженерики будут иметь недостаток безопасности типа если бы это было разрешено).
Есть ли какие-либо важные преимущества использования массивов, которые я упустил?
Постоянный доступ к любому элементу с очень маленькой константой. Для безопасного доступа к элементу массива требуется всего несколько инструкций: пара загрузок, сравнение и переход. Ветвь обычно успешна почти в 100% случаев, поэтому современное оборудование отлично справляется с ее прогнозированием.
Если ваш список меняется нечасто, списки добавляют много лишнего веса к объекту, который вы никогда не будете использовать. Когда вы пытаетесь запустить что-то, что нужно оптимизировать, это полезно. Этот дополнительный вес также делает работу медленнее, чем если бы вы использовали только массивы. Однако, если вы не знаете, что вам нужны преимущества, которые дают массивы, вам следует использовать только списки.
Одна вещь, о которой я здесь не упоминал: массивы могут иметь N измерений, тогда как списки ограничены одним. Вы можете использовать списки списков, но синтаксис ( List
) намного более громоздкий, чем [] [] >
Я полагаю, теоретический ответ заключается в том, что массивы должны иметь лучшую производительность, потому что коллекции Generic имеют дополнительные уровни абстракции. Лично я в бизнес приложениях вижу очень мало пользы от использования массивов по сравнению с общими коллекциями.
Это действительно зависит от ситуации. Массивы невероятно быстрые, но имеют фиксированный размер и могут не подходить, если объем данных, которые вам нужно обработать, очень велик. Коллекции, с другой стороны, имеют разную степень производительности в зависимости от конкретного подкласса. Например, ArrayList - это в основном просто оболочка для массива, поэтому он должен иметь одинаковую скорость итерации и требования к памяти. Для себя я обычно использую интерфейс Iterable
Массивы лучше в следующих ситуациях:
Массивы:
Коллекции, похожие на Array:
ArrayList
- быстрое чтение и добавление в конецList
. Использует внутренний массив. Медленный, если нужно увеличить размер List
LinkedList
- быстрое добавление в обе стороны List
. Быстрое динамическое увеличение/уменьшение размера. Не использует внутренний массивВывод:
Рекомендую использовать подходящую для вашего сценария Collection. Не боритесь с Array []
, потому что пакет Collections
предлагает очень удобные API, такие как add()
, addAll()
и т.д.
Ссылка: Более подробное сравнение вы можете найти здесь -> "Arrays vs ArrayList vs LinkedList vs..."