Предположим, вам нужно хранить / извлекать элементы в Collection
, не заботясь о порядке, и дубликаты разрешены, какого типа of Collection
вы используете?
По умолчанию я всегда использовал ArrayList
, но я помню, как где-то читал / слышал, что реализация Queue
может быть лучший выбор. Список Список
позволяет добавлять / извлекать / удалять элементы в произвольных позициях, что снижает производительность. Поскольку Очередь
не предоставляет эту возможность, она теоретически должна быть быстрее, когда это средство не требуется.
Я понимаю, что все обсуждения производительности в некоторой степени бессмысленны, единственное, что действительно имеет значение, - это измерение. Тем не менее, мне интересно узнать, что другие используют для Коллекции
, когда они не заботятся о порядке, а дубликаты разрешены, и почему ?
"Это зависит". Сначала вам действительно нужно ответить на вопрос: «Для чего я хочу использовать коллекцию?»
Если вы часто вставляете / удаляете элементы на одном из концов (начало, конец), Queue
будет лучше, чем ArrayList
. Однако во многих случаях вы создаете коллекцию для того, чтобы просто читать ее. В этом случае ArrayList намного более эффективен: поскольку он реализован как массив, вы можете довольно эффективно перебирать его (то же самое относится и к LinkedList
). Однако LinkedList использует ссылки для связывания отдельных элементов вместе. Поэтому, если вам не нужно случайное удаление элементов (в середине), лучше использовать ArrayList
: ArrayList
будет использовать меньше памяти, поскольку элементы не нуждаются в хранилище для ссылка на следующий / предыдущий элемент.
Подводя итог:
ArrayList
= хорошо, если вы вставляете один раз и часто читаете (произвольный или последовательный)
LinkedList
= хорошо, если вы часто вставляете / удаляете в случайных местах и читаете только последовательный
ArrayDeque
(только java6) = хорошо, если вы вставляете / удаляете в начале / конце и читаете случайное или последовательное
ArrayList в основном содержит массив внутри (поэтому он называется ArrayList). А такие операции, как добавление / удаление в произвольных позициях, выполняются просто, поэтому, если вы их не используете, это не повредит производительности.
По умолчанию я предпочитаю LinkedList
вместо ArrayList
. Очевидно, я использую их не через интерфейс List
, а скорее через интерфейс Collection
.
Со временем я действительно обнаружил, что, когда мне нужна общая коллекция, мне нужно более или менее вставить некоторые вещи, а затем перебрать их. Если мне нужно более развитое поведение (например, произвольный доступ, сортировка или проверки на уникальность), я, возможно, изменю используемую реализацию, но перед этим я изменю используемый интерфейс на наиболее подходящий. Таким образом, я могу убедиться, что функция предоставлена, прежде чем сосредоточиться на оптимизации и внедрении.
Это зависит от того, что вы об этом знаете.
Если я понятия не имею, я предпочитаю использовать связанный список, поскольку штраф за добавление / удаление в конце является постоянным. Если у меня есть приблизительное представление о его максимальном размере, я выбираю arrayylist с указанной емкостью, потому что это быстрее, если оценка хорошая. Если я действительно знаю точный размер, я предпочитаю обычный массив; хотя на самом деле это не тип коллекции.
Я понимаю, что все обсуждения производительности бессмысленны, единственное, что действительно имеет значение, - это измерения.
Это не обязательно правда.
Если ваши знания о том, как будет работать приложение , говорят вам, что определенные коллекции будут очень большими, тогда будет хорошей идеей выбрать правильный тип коллекции. Но правильный тип коллекции зависит критически от того, как коллекции будут использоваться; т.е. по алгоритмам.
Например, если в вашем приложении, вероятно, будет преобладать тестирование, содержит ли коллекция данный объект, тот факт, что Collection.содержит (Object)
is O (N)
для обоих LinkedList
и ArrayList
может означать, что ни один из них не является соответствующий тип коллекции. Вместо этого, возможно, вам следует представить коллекцию в виде HashMap
, где Integer
представляет количество вхождений T
в «коллекцию ". Это даст вам O (1)
тестирование и удаление за счет дополнительных служебных данных и более медленной (хотя все еще O (1)
) вставки.
Но следует подчеркнуть, что если вы, вероятно, имеете дело с действительно большими коллекциями, не должно быть такой вещи, как тип коллекции по умолчанию. Вы должны думать о коллекции в контексте алгоритмов. (И обратная сторона медали состоит в том, что если коллекции всегда будут небольшими, вероятно, не будет большой разницы, какой тип коллекции вы выберете.)
Если упорядочивание и дублирование не является проблемой, а случай предназначен только для хранения,
я использую ArrayList , поскольку он реализует все операции со списком. Никогда не чувствовал проблем с производительностью с этими операциями (никогда не влиял на мои проекты). На самом деле эти операции просты в использовании, и мне не нужно заботиться о том, как они управляются внутри.
Только если несколько потоков будут обращаться к этому списку, я использую Vector , потому что его методы синхронизированы.
Также ArrayList и Vector - это коллекции, которые вы изучаете в первую очередь :).