Преимущества массивов

Поскольку я вижу его, преимущества списка по массиву довольно очевидны:

  • Дженерики обеспечивают более точный ввод: List<Integer>, List<? extends Number>, List<? super Integer>.
  • Интерфейс List имеет набор полезные методы: addAll, remove и т.д. В то время как для массивов все стандартные операции кроме получают/устанавливают, должен быть выполнен способом процедуры путем передачи его статическому методу.
  • Наборы предлагают различные реализации как ArrayList, LinkedList, unmodifieable и синхронизируемые списки, которые могут быть скрыты под общим интерфейсом List.
  • Управление длиной OOB.

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

29
задан Vitalii Fedorenko 16 May 2010 в 17:58
поделиться

9 ответов

Массивы более эффективны как с точки зрения времени обработки, так и с точки зрения объема памяти. Это особенно применимо, если вы работаете с примитивными типами, такими как int или long , поскольку List требует, чтобы все элементы были заключены в объект Object (например, Целое или Длинное ). Хотя функции автобокса, представленные в Java 5, сокращают объем кода, необходимого для такой упаковки и развертывания, она не устраняет проблем с производительностью, поскольку объекты оболочки все еще создаются.

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

20
ответ дан 28 November 2019 в 01:32
поделиться

Скорость.Коллекции несколько медленнее, чем простые массивы: большинство из них по-прежнему используют массивы, но имеют дополнительные слои кода вокруг них. Конечно, если у вас нет особой потребности в дополнительной производительности, вы все равно должны использовать коллекции.

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

5
ответ дан 28 November 2019 в 01:32
поделиться

В дополнение к другим ответам, есть одно тонкое свойство массивов, которое можно рассматривать как преимущество перед списками. Это можно проиллюстрировать следующим кодом:

//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

В то время как массив подкласса ЯВЛЯЕТСЯ массивом суперкласса, списки подклассов НЕ являются списками суперклассов (и для этого есть веская причина - дженерики будут иметь недостаток безопасности типа если бы это было разрешено).

2
ответ дан 28 November 2019 в 01:32
поделиться

Есть ли какие-либо важные преимущества использования массивов, которые я упустил?

Постоянный доступ к любому элементу с очень маленькой константой. Для безопасного доступа к элементу массива требуется всего несколько инструкций: пара загрузок, сравнение и переход. Ветвь обычно успешна почти в 100% случаев, поэтому современное оборудование отлично справляется с ее прогнозированием.

4
ответ дан 28 November 2019 в 01:32
поделиться

Если ваш список меняется нечасто, списки добавляют много лишнего веса к объекту, который вы никогда не будете использовать. Когда вы пытаетесь запустить что-то, что нужно оптимизировать, это полезно. Этот дополнительный вес также делает работу медленнее, чем если бы вы использовали только массивы. Однако, если вы не знаете, что вам нужны преимущества, которые дают массивы, вам следует использовать только списки.

12
ответ дан 28 November 2019 в 01:32
поделиться

Одна вещь, о которой я здесь не упоминал: массивы могут иметь N измерений, тогда как списки ограничены одним. Вы можете использовать списки списков, но синтаксис ( List > ) намного более громоздкий, чем [] []

7
ответ дан 28 November 2019 в 01:32
поделиться

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

2
ответ дан 28 November 2019 в 01:32
поделиться

Это действительно зависит от ситуации. Массивы невероятно быстрые, но имеют фиксированный размер и могут не подходить, если объем данных, которые вам нужно обработать, очень велик. Коллекции, с другой стороны, имеют разную степень производительности в зависимости от конкретного подкласса. Например, ArrayList - это в основном просто оболочка для массива, поэтому он должен иметь одинаковую скорость итерации и требования к памяти. Для себя я обычно использую интерфейс Iterable везде, где это возможно, поскольку это дает максимальную гибкость моему коду, позволяя ему обрабатывать резидентные массивы в памяти, а также списки данных, которые извлекаются из файла или по сети. используя настраиваемый класс итератора / итератора. Когда пришло время фактически создать экземпляр объекта Iterable, который я передаю, это зависит от конкретной ситуации; если я знаю размер, и он сразу уместится в памяти, я просто использую массив, а если он, возможно, вырастет, я буду использовать ArrayList, а если ему потребуется быстрая вставка с обоих концов, я буду использовать LinkedList.

0
ответ дан 28 November 2019 в 01:32
поделиться

Массивы лучше в следующих ситуациях:

  • вы знаете, что будете работать с фиксированным количеством элементов в массиве
  • вам не нужно менять размер массива

Массивы:

  • быстрее любой коллекции

Коллекции, похожие на Array:

  • ArrayList - быстрое чтение и добавление в конецList. Использует внутренний массив. Медленный, если нужно увеличить размер List
  • LinkedList - быстрое добавление в обе стороны List. Быстрое динамическое увеличение/уменьшение размера. Не использует внутренний массив

Вывод:

Рекомендую использовать подходящую для вашего сценария Collection. Не боритесь с Array [], потому что пакет Collections предлагает очень удобные API, такие как add(), addAll() и т.д.


Ссылка: Более подробное сравнение вы можете найти здесь -> "Arrays vs ArrayList vs LinkedList vs..."

1
ответ дан 28 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: