Какую коллекцию 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, включая блок-схему и т. д.


