В Java, когда было бы предпочтительным использовать список, а не массив?
Когда использовать список над массивом в Java?
Ответ 1
Я рассматриваю вопрос как противоположный
Когда вы должны использовать массив над списком?
Только у вас есть конкретные причины для этого (например: "Ограничения проекта", "Проблемы с памятью" (не очень хорошая причина) и т.д.)
Списки намного проще в использовании (imo) и имеют гораздо большую функциональность.
Примечание. Вы также должны рассмотреть, подходит ли что-то вроде набора или другой структуры данных, лучше, чем список для того, что вы пытаетесь сделать.
Каждая структура данных и импликация имеют разные плюсы и минусы. Выберите те, которые превосходят то, что вам нужно сделать.
Если вам нужно, чтобы get() был O (1) для любого элемента? Вероятно, используйте ArrayList, Need O (1) insert()? Возможно, связанный список. Need O (1) содержит()? Возможно, Hashset.
TL;DR: Каждая структура данных хороша в некоторых вещах, а в других - плохо. Посмотрите на свои цели и выберите структуру данных, которая наилучшим образом соответствует данной проблеме.
Изменить:
Нельзя заметить, что вы лучше объявить переменную как его интерфейс (т.е. список или очередь) а не его реализующий класс. Таким образом, вы можете изменить реализации в более поздний срок не изменяя ничего в код.
В качестве примера:
List<String> myList = new ArrayList<String>();
против
List<String> myList = new LinkedList<String>();
Обратите внимание, что myList - это список в обоих примерах. - R. Bemrose
Ответ 2
Правила большого пальца:
- Используйте
List
для ссылочных типов. - Используйте массивы для примитивов.
- Если вам нужно иметь дело с API, который использует массивы, может быть полезно использовать массивы. OTOH, может быть полезно обеспечить защитное копирование с помощью системы типов с помощью
List
s. - Если вы выполняете много операций типа
List
в последовательности и не находитесь в критическом разделе производительности/памяти, используйтеList
. - Оптимизация на низком уровне может использовать массивы. Ожидайте гадости с оптимизацией на низком уровне.
Ответ 3
Большинство людей уже ответили на него.
Практически нет оснований использовать массив вместо List. Основное исключение - это примитивный массив (например, int[]
). Вы не можете создать примитивный список (должен иметь List<Integer>
).
Самое важное отличие заключается в том, что при использовании List вы можете решить, какая реализация будет использоваться. Наиболее очевидным является выбор LinkedList или ArrayList.
Я хотел бы указать в этом ответе, что выбор реализации дает вам очень тонкий контроль над данными, которые просто недоступны для массива:
- Вы можете запретить клиенту изменять ваш список, обернув список в
Collection.unmodifiableList
- Вы можете синхронизировать список для многопоточности с помощью
Collection.synchronizedList
- Вы можете создать очередь с фиксированной длиной с реализацией
LinkedBlockingQueue
- ... и т.д.
В любом случае, даже если вы не хотите (сейчас) какой-либо дополнительной функции в списке. Просто используйте ArrayList и размер его с размером массива, который вы создали. Он будет использовать Array в back-end, а разница в производительности с реальным массивом будет незначительной. (за исключением примитивных массивов)
Ответ 4
Довольно часто всегда предпочитают список. Списки имеют гораздо большую функциональность, особенно поддержку итератора. Вы можете преобразовать список в массив в любое время с помощью метода toArray().
Ответ 5
Всегда предпочитайте списки.
Массивы, когда
- Varargs для метода (я думаю, вы вынуждены использовать массивы здесь).
- Если вы хотите, чтобы ваши коллекции были ковариантными (массивы ссылочных типов ковариантны).
- Критический код производительности.
Ответ 6
Если вы знаете, сколько вещей вы будете держать, вам понадобится массив. Мой экран имеет размер 1024x768, и буфер пикселов для этого не изменится по размеру во время выполнения.
Если вы знаете, что вам нужно получить доступ к определенным индексам (перейдите к элементу № 763!), используйте список массивов или массивов.
Если вам нужно регулярно добавлять или удалять элементы из группы, используйте связанный список.
В целом, это касается аппаратных средств, массивов, работающих с пользователями, списков.
Ответ 7
Это зависит от того, какой список.
Лучше использовать LinkedList, если вы знаете, что вставляете много элементов в позиции, отличные от конца. LinkedList не подходит для произвольного доступа (получение i-го элемента).
Лучше использовать ArrayList, если вы заранее не знаете, сколько элементов будет. ArrayList правильно амортизирует стоимость выращивания массива подкрепления при добавлении к нему большего количества элементов и подходит для случайного доступа, когда элементы находятся на своем месте. ArrayList может быть эффективно отсортирован.
Ответ 8
Если вы хотите, чтобы массив элементов расширялся (т.е. если вы не знаете, какой размер списка будет заблаговременно), список будет полезен. Однако, если вам нужна производительность, вы обычно используете массив.
Ответ 9
Во многих случаях тип используемой коллекции - это деталь реализации, которая не должна подвергаться внешнему миру. Чем более универсальным является ваш возвращаемый тип, тем больше гибкости вы впоследствии меняете реализацию.
Массивы (примитивный тип, т.е. new int [10]) не являются общими, вы не сможете изменить свою реализацию без внутреннего преобразования или изменения кода клиента. Возможно, вы захотите рассмотреть Iterable как возвращаемый тип.