В этом вопросе Как я могу эффективно выбрать контейнер стандартной библиотеки в C ++ 11?- это удобная блок-схема, которую можно использовать при выборе коллекций C ++.
Я подумал, что это полезный ресурс для людей, которые не уверены, какую коллекцию им следует использовать, поэтому я попытался найти аналогичную блок-схему для Java, но не смог.
Какие ресурсы и «шпаргалки» доступны, чтобы помочь людям выбрать правильную коллекцию для использования при программировании на Java? Как люди узнают, какие реализации List, Set и Map им следует использовать?
Ответы:
Поскольку мне не удалось найти подобную блок-схему, я решил сделать ее сам.
Эта блок-схема не пытается охватить такие вещи, как синхронизированный доступ, безопасность потоков и т. Д. Или устаревшие коллекции, но она охватывает 3 стандартных набора , 3 стандартных карты и 2 стандартных списка .
Это изображение было создано для этого ответа и находится под международной лицензией Creative Commons Attribution 4.0. Самая простая атрибуция - это ссылка на этот вопрос или на этот ответ.
Другие источники
Вероятно, наиболее полезной другой ссылкой является следующая страница документации Oracle, которая описывает каждую коллекцию .
HashSet против TreeSet
Подробное обсуждение того, когда использовать,
HashSet
илиTreeSet
здесь: Hashset vs TreesetArrayList против LinkedList
Подробное обсуждение: когда использовать LinkedList вместо ArrayList?
источник
LinkedList
противArrayList
. Во-первых,LinkedList
предпочтительно , если список значительный .LinkedList
имеет накладные расходы на каждый элемент, поэтому он асимптотически хуже с точки зрения потребления памяти, чемArrayList
. Кроме того, если большая часть доступа находится в конце списка,ArrayList
предпочтительнее использовать элемент, поскольку он обеспечивает доступ к произвольным элементам с постоянным временем. Доступ кn
th элементу aLinkedList
- этоO(n)
операция. ... Фактически, решение использовать связанный список почти всегда должно быть отрицательным.LinkedList
- это двусвязный список, поэтому доступ в начале и в конце выполняется быстро. Вы заметите, что из приведенных выше веток на все три вопроса необходимо ответить «да», прежде чем я рекомендую использоватьLinkedList
- другими словами, я согласен с вами, что в большинстве случаев ответ отрицательный. Такие вещи, как очереди и удаление из очереди, где вы постоянно добавляете и удаляете элементы с концов области списка, хороший вариант использованияLinkedList
.LinkedList
использует больше памяти на элемент ...ArrayList
никогда не освобождает память. Это означает, что если у вас есть список, который иногда увеличивается до огромного размера, но обычно невелик, то производительностьArrayList
памяти будет хуже. Накладные расходы на память самого элементаList
обычно (хотя и не всегда) малы по сравнению с элементами, которые он также содержит.Map<K,V>
не является частьюjava.util.collection
Сводка основных несинхронизированных и одновременных коллекций
Collection
: Интерфейс, представляющий неупорядоченный «мешок» элементов, называемый «элементами». «Следующий» элемент не определен (случайный).Set
: Интерфейс, представляющийCollection
без дубликатов.HashSet
: АSet
подкрепленаHashtable
. Максимально быстрое и минимальное использование памяти, при заказе неважно.LinkedHashSet
: AHashSet
с добавлением связанного списка для связывания элементов в порядке вставки . «Следующий» элемент - это последний вставленный элемент.TreeSet
: A,Set
где элементы упорядочены по aComparator
(обычно естественный порядок ). Самое медленное и максимальное использование памяти, но необходимо для упорядочивания на основе компаратора.EnumSet
: Чрезвычайно быстрый и эффективный,Set
настроенный для одного типа перечисления.List
: Интерфейс, представляющий aCollection
, элементы которого упорядочены, и каждый имеет числовой индекс, представляющий его позицию, где ноль - это первый элемент, а(length - 1)
- последний.ArrayList
:List
Поддерживается массивом, где длина массива (называемая «емкостью») не меньше количества элементов («размер» списка). Когда размер превышает емкость (при(capacity + 1)-th
добавлении элемента), массив воссоздается с новой емкостью - это(new length * 1.5)
восстановление выполняется быстро, поскольку оно используетSystem.arrayCopy()
. Удаление и вставка / добавление элементов требует, чтобы все соседние элементы (справа) были перемещены в это пространство или из него. Доступ к любому элементу происходит быстро, так как(element-zero-address + desired-index * element-size)
для определения его местоположения требуется только расчет . В большинстве случаев ,ArrayList
предпочтительно большеLinkedList
.LinkedList
: Объект,List
поддерживаемый набором объектов, каждый из которых связан со своими «предыдущими» и «следующими» соседями. АLinkedList
также являетсяQueue
иDeque
. Доступ к элементам осуществляется, начиная с первого или последнего элемента и перемещаясь, пока не будет достигнут желаемый индекс. Вставка и удаление, как только желаемый индекс достигнут посредством обхода, является тривиальным делом повторного сопоставления только ссылок непосредственного соседа, чтобы указать на новый элемент или обойти теперь удаленный элемент.Map
: Интерфейс, представляющий,Collection
где каждый элемент имеет идентифицирующий «ключ» - каждый элемент представляет собой пару «ключ-значение».HashMap
: A,Map
где ключи неупорядочены и поддерживаютсяHashtable
.LinkedhashMap
: Ключи отсортированы по порядку вставки .TreeMap
: A,Map
где ключи расположены в порядкеComparator
(обычно естественный порядок).Queue
: Интерфейс, который представляет собой,Collection
где элементы, как правило, добавляются к одному концу и удаляются с другого (FIFO: first-in, first-out).Stack
: Интерфейс, который представляет собой,Collection
где элементы, как правило, добавляются (выталкиваются) и удаляются (выталкиваются) с одного и того же конца (LIFO: последний пришел, первый ушел).Deque
: Сокращение от «двусторонняя очередь», обычно произносится как «колода». Связанный список, который обычно добавляется и читается только с любого конца (а не с середины).Основные схемы сбора:
Сравнение вставки элемента с помощью
ArrayList
иLinkedList
:источник
Здесь еще более простая картина. Умышленно упрощено!
Коллекция - это все, что хранит данные, называемые «элементами» (одного типа). Ничего более конкретного не предполагается.
Список - это индексированная коллекция данных, каждый элемент которой имеет индекс. Что-то вроде массива, но более гибкое.
Данные в списке сохраняют порядок вставки.
Типовая операция: получить n-й элемент.
Набор - это набор элементов , каждый элемент только один раз (элементы различаются по их
equals()
методу.Данные в наборе хранятся в основном для того, чтобы знать, какие данные там есть.
Типичная операция: узнать, присутствует ли элемент в списке.
Карта чем-то похожа на список, но вместо доступа к элементам по их целочисленному индексу выполучаетедоступ к ним по их ключу , которым является любой объект. Как и массив в PHP :)
Данные на карте доступны для поиска по их ключу.
Типичная работа: получить элемент по его ID (где ID любого типа, а не только
int
как в случае со списком).Различия
Набор и карта: в наборе вы ищите данные сами по себе , а на карте - по их ключу .
Список и карта: в списке вы получаете доступ к элементу по их
int
индексу (позиции в списке), а в карте по их ключу, который имеет любой тип (обычно: ID)Список и набор: в списке элементы связаны своим положением и могут дублироваться, в то время как в наборе элементы просто «присутствуют» (пр нет) и уникальны (в значении
equals()
илиcompareTo()
дляSortedSet
)источник
Это просто: если вам нужно хранить значения с сопоставленными им ключами, используйте интерфейс Map, в противном случае используйте List для значений, которые могут дублироваться, и, наконец, используйте интерфейс Set, если вы не хотите, чтобы повторяющиеся значения в вашей коллекции.
Вот полное объяснение http://javatutorial.net/choose-the-right-java-collection , включая блок-схему и т. Д.
источник
карта
При выборе a
Map
я сделал эту таблицу, в которой суммировал функции каждой из десяти реализаций, связанных с Java 11.источник
Общие коллекции, Общие коллекции
источник
Какую коллекцию Java мне следует использовать?
Это зависит от того, какую проблему вы пытаетесь решить или какие у вас требования.
Примеры :
источник