Википедия, конечно, имеет в основном всю информацию, которую необходимо было бы когда-либо знать. Но твердая часть должна знать, где запустить. Я рекомендовал бы начаться путем чтения о лицензия Apache и GNU GPL, которые являются двумя популярными сторонами к той же истории, каждый предлагающие различные свободы людям, связанным с кодом.
, Но здесь это вкратце: лицензия Apache позволяет любому сделать что-либо с Вашим кодом, включая взятие его и использование его в продукте с закрытым исходным кодом. Это дает, кто бы ни берет код свобода , чтобы сделать то, что они хотят с ним.
GNU GPL, с другой стороны, позволяет Вашему коду [только 112] использоваться в проекте, который также распределяется под GPL. В этом случае Вы могли бы записать некоторый код и препятствовать тому, чтобы частная компания использовала Вашу работу. Здесь, Вы даете свобода к самому коду, что это будет всегда использоваться в "бесплатных" целях.
Я вижу вопрос как противоположный-
Когда следует использовать Массив над списком?
Только у вас есть конкретная причина для этого (например: ограничения проекта, проблемы с памятью (на самом деле неважная причина) и т. Д.)
Списки намного проще в использовании (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 является списком в обоих примерах. - Р. Бемроуз
Большинство людей уже ответили на него.
Практически нет веских причин для использования array вместо List. Основное исключение - это примитивный массив (например, int []
). Вы не можете создать примитивный список (должен иметь List
).
Самое важное отличие состоит в том, что при использовании List вы можете решить, какая реализация будет использоваться. Наиболее очевидным является выбор LinkedList или ArrayList.
В этом ответе я хотел бы указать, что выбор реализации дает вам очень точный контроль над данными, которые просто недоступны для массива:
Сборник. unmodifiableList
Collection.synchronizedList
LinkedBlockingQueue
В любом случае, даже если вы не хотите (сейчас) каких-либо дополнительных функций в списке. Просто используйте ArrayList и задайте размер в соответствии с размером массива, который вы бы создали. Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов)
Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов) Он будет использовать массив в серверной части, и разница в производительности с реальным массивом будет незначительной. (кроме примитивных массивов)Всегда предпочитать списки.
Массивы, когда
Эмпирические правила:
Список
для ссылочных типов. List
s. List
над последовательностью, и она не находится в критической секции производительности / памяти, тогда используйте List
. Практически всегда предпочитаю список. Списки имеют гораздо больше функций, в частности, поддержку итераторов. Вы можете преобразовать список в массив в любое время с помощью метода toArray ().
Если вы знаете, сколько вещей вы будете держать, вам понадобится массив. У меня экран 1024x768, и буфер пикселей для этого не изменится в размере когда-либо во время выполнения.
Если вы знаете, что вам нужно получить доступ к определенным индексам (возьмите элемент # 763) !) используйте массив или список на основе массива.
Если вам нужно регулярно добавлять или удалять элементы из группы, используйте связанный список.
В общем, работа с оборудованием, массивами, работа с пользователями, списками .
Это зависит от типа списка.
Лучше использовать LinkedList, если вы знаете, что будете вставлять много элементов не в конец, а в другие позиции. LinkedList не подходит для произвольного доступа (получения i-го элемента).
Лучше использовать ArrayList, если вы не знаете заранее, сколько элементов там будет. ArrayList правильно амортизирует стоимость роста массива поддержки по мере добавления в него дополнительных элементов и подходит для произвольного доступа, когда элементы находятся на месте. ArrayList можно эффективно отсортировать.
Если вы хотите, чтобы массив элементов расширялся (т. Е. Если вы заранее не знаете, какой будет размер списка), будет полезен список. Однако, если вам нужна производительность, вы обычно используете массив.
Во многих случаях тип используемой коллекции - это деталь реализации, которая не должна открываться внешнему миру. Чем более универсален ваш тип возврата, тем больше гибкости у вас будет после изменения реализации.
Массивы (примитивный тип, например, новый int [10]) не являются универсальными, вы не сможете изменить свою реализацию без внутреннего преобразования. или изменение клиентского кода. Возможно, вы захотите рассмотреть Iterable как возвращаемый тип.