Какую коллекцию Java я должен использовать?
В этом вопросе Как я могу эффективно выбрать контейнер стандартной библиотеки в С++ 11? - удобная блок-схема, используемая при выборе коллекций С++.
Я думал, что это полезный ресурс для людей, которые не уверены, какую коллекцию они должны использовать, поэтому я попытался найти аналогичную блок-схему для Java и не смог этого сделать.
Какие ресурсы и "чит-листы" доступны, чтобы помочь людям выбрать нужную коллекцию для использования при программировании на Java? Как люди знают, какие реализации List, Set и Map они должны использовать?
Ответы
Ответ 1
Поскольку я не мог найти подобную блок-схему, я решил сделать ее сам.
В этой блок-схеме не рассматриваются и такие функции, как синхронизированный доступ, безопасность потоков и т.д. или устаревшие коллекции, но он охватывает 3 стандартных Установить, 3 стандартных Карта s и 2 стандартных Список.
![enter image description here]()
Это изображение было создано для этого ответа и лицензировано по лицензии Creative Commons Attribution 4.0. Простейшая атрибуция заключается в ссылке на этот вопрос или на этот ответ.
Другие ресурсы
Вероятно, самая полезная другая ссылка - это следующая страница из документации оракула, которая описывает каждый Collection.
HashSet vs TreeSet
Существует подробное обсуждение того, когда следует использовать HashSet
или TreeSet
здесь:
Hashset vs Treeset
ArrayList vs LinkedList
Подробное обсуждение: Когда использовать LinkedList над ArrayList?
Ответ 2
Сводка основных не параллельных, несинхронизированных коллекций
Collection
: интерфейс, представляющий неупорядоченную "сумку" предметов, называемых "элементами". Следующий элемент не определен (случайно).
-
Set
: интерфейс, представляющий Collection
без дубликатов. -
HashSet
: Set
поддерживаемый Hashtable
. Самое быстрое и наименьшее использование памяти при заказе неважно. -
LinkedHashSet
: HashSet
с добавлением связанного списка для связывания элементов в порядке вставки. Элемент "следующий" - это следующий за последним вставленный элемент. -
TreeSet
: Set
котором элементы упорядочены Comparator
(обычно естественное упорядочение). Медленное и самое большое использование памяти, но необходимое для упорядочения на основе компаратора. -
EnumSet
: чрезвычайно быстрый и эффективный Set
настроенный для одного типа перечисления.
-
List
: Интерфейс, представляющий Collection
, элементы которой упорядочены, и каждый имеет числовой индекс, представляющий его позицию, где ноль - первый элемент, а (length - 1)
- последний. -
ArrayList
: List
поддерживаемый массивом, где массив имеет длину (называемую "емкость"), которая по крайней мере равна числу элементов (список "размер"). Когда размер превышает емкость (когда (capacity + 1)-th
элемент (capacity + 1)-th
), массив воссоздается с новой емкостью (new length * 1.5)
- -th - это быстрое восстановление, поскольку он использует System.arrayCopy()
. Удаление и вставка/добавление элементов требует, чтобы все соседние элементы (справа) были сдвинуты в или из этого пространства. Доступ к любому элементу быстрый, так как требуется только вычисление (element-zero-address + desired-index * element-size)
чтобы найти его местоположение. В большинстве ситуаций ArrayList
предпочтительнее, чем LinkedList
. -
LinkedList
: List
поддерживаемый набором объектов, каждый из которых связан со своими "предыдущими" и "следующими" соседями. LinkedList
- это также Queue
и Deque
. Доступ к элементам осуществляется начиная с первого или последнего элемента и проходя до достижения желаемого индекса. Вставка и удаление, как только требуемый индекс достигнут с помощью обхода, является тривиальным вопросом переотображения только непосредственных соседних ссылок для указания на новый элемент или обхода теперь удаленного элемента.
-
Map
: интерфейс, представляющий Collection
где каждый элемент имеет идентифицирующий элемент "ключ" --each является парой ключ-значение. -
HashMap
: Map
где ключи неупорядочены и поддерживаются Hashtable
. -
LinkedhashMap
: ключи упорядочены по порядку вставки. -
TreeMap
: Map
где ключи упорядочены Comparator
(обычно естественное упорядочение).
-
Queue
: интерфейс, представляющий Collection
которой элементы обычно добавляются к одному концу и удаляются из другого (FIFO: первым пришел, первым вышел). -
Stack
: интерфейс, представляющий Collection
которой элементы, как правило, одновременно добавляются (помещаются) и удаляются (извлекаются) с одного и того же конца (LIFO: последний пришел, первый вышел). -
Deque
: Сокращение от "двусторонней очереди", обычно произносится как "колода". Связанный список, который обычно добавляется и читается только с любого конца (но не с середины).
Основные диаграммы коллекции:
![diagram]()
Сравнение вставки элемента с ArrayList
и LinkedList
:
![diagram]()
Ответ 3
Еще более простая картина здесь. Намеренно упрощено!
-
Коллекция - это все, что содержит данные, называемые "элементами" (того же типа). Ничего более конкретного не предполагается.
-
Список - это индексированная коллекция данных, где каждый элемент имеет индекс. Что-то вроде массива, но более гибкое.
Данные в списке сохраняют порядок вставки.
Типичная операция: получить n-й элемент.
-
Набор представляет собой пакет элементов, каждый элемент только один раз (элементы различаются с помощью метода equals()
.
Данные в наборе хранятся в основном только для того, чтобы знать, какие данные есть.
Типичная операция: скажите, присутствует ли элемент в списке.
-
Map - это что-то вроде List, но вместо того, чтобы обращаться к элементам по их целочисленному индексу, вы обращаетесь к ним по ключу, который является любым объектом. Как массив в PHP :)
Данные в карте доступны для поиска по их ключу.
Типичная операция: получить элемент по его идентификатору (где идентификатор любого типа, а не только int
как в случае List).
Различия
-
Set и Map: в Set вы ищите данные самостоятельно, а в Map - по ключу.
-
Список и Карта: в Списке вы получаете доступ к элементу по их индексу int
(позиция в Списке), в то время как в Карте по их ключу - любой тип (обычно: ID)
-
Список и Набор: в Списке элементы связаны их положением и могут быть повторены, в то время как в Набор элементы просто "присутствуют" (pr не присутствует) и являются уникальными (в смысле equals()
или compareTo()
для SortedSet
)
Ответ 4
Это просто: если вам нужно хранить значения с отображаемыми ключами, перейдите для интерфейса карты, в противном случае используйте List для значений, которые могут быть дублированы, и, наконец, используйте интерфейс Set, если вы не хотите дублировать значения в своей коллекции.
Вот полное объяснение http://javatutorial.net/choose-the-right-java-collection, включая блок-схему и т.д.
Ответ 5
Общие коллекции, Общие коллекции
![enter image description here]()
Ответ 6
Какую коллекцию Java я должен использовать?
Это зависит от того, какую проблему вы пытаетесь решить или какие у вас требования.
Примеры:
- Хотите, чтобы элементы сортировались при их хранении? HashSet
- Вы хотите, чтобы пары (ключ, значение) были сохранены? HashMap
- Вы хотите, чтобы порядок элементов при вставке сохранялся? ArrayList, LinkedList
- Вы хотите отсортировать ключи в (ключ, значение) пары? - сильный текст
- Вы хотите реализовать стек для решения вашей проблемы? - стек
- Хотите ли вы иметь доступ FIFO (первым пришел - первым вышел)? - очередь
- Вы хотите, чтобы были сохранены только уникальные элементы? - HashSet
- Вы хотите разрешить ключу "Нуль" при сохранении (Ключ, Значение)? - HashMap
- Хотите ли вы иметь значения NULL для пары (Key, Value)? Хеш-таблица