Когда использовать Список по Массиву в Java?

Википедия, конечно, имеет в основном всю информацию, которую необходимо было бы когда-либо знать. Но твердая часть должна знать, где запустить. Я рекомендовал бы начаться путем чтения о лицензия Apache и GNU GPL, которые являются двумя популярными сторонами к той же истории, каждый предлагающие различные свободы людям, связанным с кодом.

, Но здесь это вкратце: лицензия Apache позволяет любому сделать что-либо с Вашим кодом, включая взятие его и использование его в продукте с закрытым исходным кодом. Это дает, кто бы ни берет код свобода , чтобы сделать то, что они хотят с ним.

GNU GPL, с другой стороны, позволяет Вашему коду [только 112] использоваться в проекте, который также распределяется под GPL. В этом случае Вы могли бы записать некоторый код и препятствовать тому, чтобы частная компания использовала Вашу работу. Здесь, Вы даете свобода к самому коду, что это будет всегда использоваться в "бесплатных" целях.

32
задан Dean J 19 October 2009 в 17:22
поделиться

9 ответов

Я вижу вопрос как противоположный-

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

Только у вас есть конкретная причина для этого (например: ограничения проекта, проблемы с памятью (на самом деле неважная причина) и т. Д.)

Списки намного проще в использовании (imo) и обладают гораздо большей функциональностью.

Примечание: вам также следует подумать, подходит ли что-то вроде Set или другой структуры данных лучше, чем List, для того, что вы пытаетесь сделать.

Каждая структура данных и имплементация имеют разные плюсы / минусы. Выберите те, которые преуспевают в том, что вам нужно.

Если вам нужно, чтобы get () было O (1) для любого элемента? Вероятно, использовать ArrayList, нужно O (1) insert ()? Возможно связанный список. Нужен O (1) contains ()? Возможно, Hashset.

TL; DR: каждая структура данных хороша в одних вещах и плоха в других. Посмотрите на свои цели и выберите структуру данных, которая лучше всего подходит для данной проблемы.

Изменить:

Одна вещь, о которой не упоминается, это то, что вы лучше объявить переменную как его интерфейс (например, список или очередь) а не его реализующий класс. Таким образом, вы можете изменить реализация на более позднем этапе ничего не меняя в код.

В качестве примера:

List<String> myList = new ArrayList<String>(); 

vs

List<String> myList = new LinkedList<String>(); 

Обратите внимание, что myList является списком в обоих примерах. - Р. Бемроуз

39
ответ дан 27 November 2019 в 20:12
поделиться

Большинство людей уже ответили на него.

Практически нет веских причин для использования array вместо List. Основное исключение - это примитивный массив (например, int [] ). Вы не можете создать примитивный список (должен иметь List ).

Самое важное отличие состоит в том, что при использовании List вы можете решить, какая реализация будет использоваться. Наиболее очевидным является выбор LinkedList или ArrayList.

В этом ответе я хотел бы указать, что выбор реализации дает вам очень точный контроль над данными, которые просто недоступны для массива:

  1. Вы можете запретить клиенту изменять свой список, заключив свой список в Сборник. unmodifiableList
  2. Вы можете синхронизировать список для многопоточности, используя Collection.synchronizedList
  3. . Вы можете создать очередь фиксированной длины с реализацией LinkedBlockingQueue
  4. ... и т.д.

В любом случае, даже если вы не хотите (сейчас) каких-либо дополнительных функций в списке. Просто используйте ArrayList и задайте размер в соответствии с размером массива, который вы бы создали. Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов)

Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов)

Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов)

10
ответ дан 27 November 2019 в 20:12
поделиться

Всегда предпочитать списки.

Массивы, когда

  1. Varargs для метода (я полагаю, вы вынуждены использовать здесь массивы).
  2. Когда вы хотите, чтобы ваши коллекции были ковариантными (массивы ссылочных типов ковариантны).
  3. Критический для производительности код .
4
ответ дан 27 November 2019 в 20:12
поделиться

Эмпирические правила:

  • Используйте Список для ссылочных типов.
  • Используйте массивы для примитивов.
  • Если вам нужно иметь дело с API, использующим массивы, может быть полезно использовать массивы. OTOH, может быть полезно обеспечить защитное копирование с помощью системы типов, используя List s.
  • Если вы выполняете много операций типа List над последовательностью, и она не находится в критической секции производительности / памяти, тогда используйте List .
  • Низкоуровневый оптимизации могут использовать массивы. Ожидайте неприятностей с низкоуровневой оптимизацией.
16
ответ дан 27 November 2019 в 20:12
поделиться

Практически всегда предпочитаю список. Списки имеют гораздо больше функций, в частности, поддержку итераторов. Вы можете преобразовать список в массив в любое время с помощью метода toArray ().

7
ответ дан 27 November 2019 в 20:12
поделиться

Если вы знаете, сколько вещей вы будете держать, вам понадобится массив. У меня экран 1024x768, и буфер пикселей для этого не изменится в размере когда-либо во время выполнения.

Если вы знаете, что вам нужно получить доступ к определенным индексам (возьмите элемент # 763) !) используйте массив или список на основе массива.

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

В общем, работа с оборудованием, массивами, работа с пользователями, списками .

2
ответ дан 27 November 2019 в 20:12
поделиться

Это зависит от типа списка.

Лучше использовать LinkedList, если вы знаете, что будете вставлять много элементов не в конец, а в другие позиции. LinkedList не подходит для произвольного доступа (получения i-го элемента).

Лучше использовать ArrayList, если вы не знаете заранее, сколько элементов там будет. ArrayList правильно амортизирует стоимость роста массива поддержки по мере добавления в него дополнительных элементов и подходит для произвольного доступа, когда элементы находятся на месте. ArrayList можно эффективно отсортировать.

1
ответ дан 27 November 2019 в 20:12
поделиться

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

0
ответ дан 27 November 2019 в 20:12
поделиться

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

Массивы (примитивный тип, например, новый int [10]) не являются универсальными, вы не сможете изменить свою реализацию без внутреннего преобразования. или изменение клиентского кода. Возможно, вы захотите рассмотреть Iterable как возвращаемый тип.

0
ответ дан 27 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

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