Подтвердить что ты не робот

Когда использовать список над массивом в Java?

В Java, когда было бы предпочтительным использовать список, а не массив?

4b9b3361

Ответ 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 как возвращаемый тип.