Какую коллекцию Java я должен использовать?
в этом вопросе Как я могу эффективно выбрать стандартный контейнер библиотеки в C++11? это удобная блок-схема для использования при выборе коллекций C++.
Я думал, что это полезный ресурс для людей, которые не уверены, какие коллекции они должны быть через я пытался найти похожую схему для Java и не смог этого сделать.
какие ресурсы и" шпаргалки " доступны, чтобы помочь людям выбрать правильную коллекцию для использования, когда программирование на Java? Как люди узнают, какие реализации списка, набора и карты они должны использовать?
4 ответа:
поскольку я не мог найти подобную блок-схему, я решил сделать ее сам.
эта блок-схема не пытается охватить такие вещи, как синхронизированный доступ, потокобезопасность и т. д. или устаревшие коллекции, но она охватывает Стандарт 3 Set s, 3 standard картаS и 2 Стандарт список s.
этот образ был создан для этого ответа и лицензирован под Creative Commons Attribution 4.0 международная лицензия. самая простая атрибуция-это ссылка на этот вопрос или этот ответ.
другие ресурсы
вероятно, наиболее полезной другой ссылкой является следующая страница из документации oracle, которая описывает каждый коллекция.
HashSet vs TreeSet
существует подробное обсуждение того, когда использовать
HashSet
илиTreeSet
здесь: Hashset vs TreesetArrayList vs LinkedList
подробное обсуждение: когда использовать LinkedList над ArrayList?
сводка основных несинхронных, несинхронизированных коллекций
Collection
: интерфейс, представляющий неупорядоченный "мешок" элементов, называемый "элементы". "Следующий" элемент не определен (случайный).
Set
: интерфейс, представляющий собойCollection
без дубликатов.
HashSet
: ASet
при поддержке aHashtable
. Самое быстрое и малое использование памяти, при заказе не имеет значения.LinkedHashSet
: AHashSet
С добавлением связанного списка для связывания элементов в порядок вставки. "Следующий" элемент-это следующий последний вставленный элемент.TreeSet
: ASet
где элементы упорядочены поComparator
(обычно естественные заказ). Самое медленное и самое большое использование памяти, но необходимое для компаратор-основанного приказывать.EnumSet
: чрезвычайно быстрый и эффективныйSet
настраивается для одного типа перечисления.List
: интерфейс, представляющий собойCollection
чьи элементы упорядочены и каждый из них имеет числовой индекс, представляющий его положение, где ноль является первым элементом, и(length - 1)
is последний.
ArrayList
: AList
поддерживается массивом, где массив имеет длину (называемую "емкостью"), которая по крайней мере равна количеству элементов ("размер"списка). Когда размер превышает емкость (когда(capacity + 1)-th
элемент добавлен), массив воссоздается с новой емкостью(new length * 1.5)
--этот отдых быстро, так как он используетSystem.arrayCopy()
. Для удаления и вставки/добавления элементов требуются все соседние элементы (вправо) переместиться в это пространство или из него. Доступ к любому элементу происходит быстро, так как для этого требуется только вычисление(element-zero-address + desired-index * element-size)
чтобы найти его местоположение. в большинстве ситуаций, anArrayList
предпочтительнее, чемLinkedList
.LinkedList
: AList
поддерживается набором объектов, каждый из которых связан со своими "предыдущими" и "следующими" соседями. АLinkedList
тожеQueue
иDeque
. Доступ к элементам осуществляется начиная с первого или последнего элемент, и обход до тех пор, пока не будет достигнут нужный индекс. Вставка и удаление, как только желаемый индекс достигается через обход является тривиальным вопросом повторного отображения только непосредственных соседних ссылок, чтобы указать на новый элемент или обойти теперь удаленный элемент.Map
: интерфейс, представляющийCollection
где каждый элемент имеет идентифицирующий "ключ" --каждый элемент является ключом-значением пара.
HashMap
: AMap
, где ключами являются неупорядоченными, и подкрепленыHashtable
.LinkedhashMap
: ключи заказываются порядок вставки.TreeMap
: AMap
где ключи заказываются aComparator
(обычно естественный порядок).Queue
: An интерфейс, который представляет собойCollection
где элементы, как правило, добавляются в один конец и удаляются из другого (FIFO: first-in, first-out).Stack
: интерфейс, который представляет собойCollection
где элементы, как правило, добавляются (выталкиваются) и удаляются (выскакивают) с одного и того же конца (LIFO: last-in, first-out).Deque
: сокращение от "двойная очередь", обычно произносится как "палуба". Один связанный список, который обычно добавляется и читается только с обоих концов (не с середины).базовая коллекция схем:
сравнение вставки элемента с
ArrayList
иLinkedList
:
еще более простая картина здесь. Намеренно упрощенный!
коллекция все, что содержит данные, называемые "элементы" (того же типа). Ничего более конкретного не предполагается.
список это проиндексированных набор данных, где каждый элемент имеет индекс. Что-то вроде массива, но более гибкий.
данные в списке сохранить порядок вставка.
Set это мешок из элементов, каждый элемент только один раз (элементы выделяются с помощью их
equals()
метод.данные в наборе хранятся в основном только для того, чтобы знать что данные есть.
карта - это что-то вроде списка, но вместо того, чтобы обращаться к элементам по их целочисленному индексу, вы обращаетесь к ним по их ключ, который каких-либо объект. Как массив в PHP :)
данные на карте можно найти по ключевым.
главная разница между набором и картой заключается в том, что в наборе вы поиск данные сами по себе, в то время как на карте купить ключ.
Это просто: если вам нужно хранить значения с ключами, сопоставленными с ними, перейдите к интерфейсу карты, в противном случае используйте Список для значений, которые могут быть дублированы, и, наконец, используйте интерфейс Set, если вы не хотите дублировать значения в своей коллекции.
вот полное объяснение http://javatutorial.net/choose-the-right-java-collection, включая блок-схему и т. д.