Тип коллекции по умолчанию

Предположим, вам нужно хранить / извлекать элементы в Collection , не заботясь о порядке, и дубликаты разрешены, какого типа of Collection вы используете?

По умолчанию я всегда использовал ArrayList , но я помню, как где-то читал / слышал, что реализация Queue может быть лучший выбор. Список Список позволяет добавлять / извлекать / удалять элементы в произвольных позициях, что снижает производительность. Поскольку Очередь не предоставляет эту возможность, она теоретически должна быть быстрее, когда это средство не требуется.

Я понимаю, что все обсуждения производительности в некоторой степени бессмысленны, единственное, что действительно имеет значение, - это измерение. Тем не менее, мне интересно узнать, что другие используют для Коллекции , когда они не заботятся о порядке, а дубликаты разрешены, и почему ?

9
задан Dónal 24 June 2015 в 03:23
поделиться

6 ответов

"Это зависит". Сначала вам действительно нужно ответить на вопрос: «Для чего я хочу использовать коллекцию?»

Если вы часто вставляете / удаляете элементы на одном из концов (начало, конец), Queue будет лучше, чем ArrayList . Однако во многих случаях вы создаете коллекцию для того, чтобы просто читать ее. В этом случае ArrayList намного более эффективен: поскольку он реализован как массив, вы можете довольно эффективно перебирать его (то же самое относится и к LinkedList ). Однако LinkedList использует ссылки для связывания отдельных элементов вместе. Поэтому, если вам не нужно случайное удаление элементов (в середине), лучше использовать ArrayList : ArrayList будет использовать меньше памяти, поскольку элементы не нуждаются в хранилище для ссылка на следующий / предыдущий элемент.

Подводя итог:

ArrayList = хорошо, если вы вставляете один раз и часто читаете (произвольный или последовательный)

LinkedList = хорошо, если вы часто вставляете / удаляете в случайных местах и ​​читаете только последовательный

ArrayDeque (только java6) = хорошо, если вы вставляете / удаляете в начале / конце и читаете случайное или последовательное

8
ответ дан 3 November 2019 в 01:52
поделиться

ArrayList в основном содержит массив внутри (поэтому он называется ArrayList). А такие операции, как добавление / удаление в произвольных позициях, выполняются просто, поэтому, если вы их не используете, это не повредит производительности.

1
ответ дан 3 November 2019 в 01:52
поделиться

По умолчанию я предпочитаю LinkedList вместо ArrayList . Очевидно, я использую их не через интерфейс List , а скорее через интерфейс Collection .

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

1
ответ дан 3 November 2019 в 01:52
поделиться

Это зависит от того, что вы об этом знаете.

Если я понятия не имею, я предпочитаю использовать связанный список, поскольку штраф за добавление / удаление в конце является постоянным. Если у меня есть приблизительное представление о его максимальном размере, я выбираю arrayylist с указанной емкостью, потому что это быстрее, если оценка хорошая. Если я действительно знаю точный размер, я предпочитаю обычный массив; хотя на самом деле это не тип коллекции.

0
ответ дан 3 November 2019 в 01:52
поделиться

Я понимаю, что все обсуждения производительности бессмысленны, единственное, что действительно имеет значение, - это измерения.

Это не обязательно правда.

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

Например, если в вашем приложении, вероятно, будет преобладать тестирование, содержит ли коллекция данный объект, тот факт, что Collection.содержит (Object) is O (N) для обоих LinkedList и ArrayList может означать, что ни один из них не является соответствующий тип коллекции. Вместо этого, возможно, вам следует представить коллекцию в виде HashMap , где Integer представляет количество вхождений T в «коллекцию ". Это даст вам O (1) тестирование и удаление за счет дополнительных служебных данных и более медленной (хотя все еще O (1) ) вставки.

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

0
ответ дан 3 November 2019 в 01:52
поделиться

Если упорядочивание и дублирование не является проблемой, а случай предназначен только для хранения,

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

Только если несколько потоков будут обращаться к этому списку, я использую Vector , потому что его методы синхронизированы.

Также ArrayList и Vector - это коллекции, которые вы изучаете в первую очередь :).

0
ответ дан 3 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

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