Какую коллекцию 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

Еще более простая картина здесь. Намеренно упрощено!

  1. Коллекция - это все, что содержит данные, называемые "элементами" (того же типа). Ничего более конкретного не предполагается.

  2. Список - это индексированная коллекция данных, где каждый элемент имеет индекс. Что-то вроде массива, но более гибкое.

    Данные в списке сохраняют порядок вставки.

    Типичная операция: получить n-й элемент.

  3. Набор представляет собой пакет элементов, каждый элемент только один раз (элементы различаются с помощью метода equals().

    Данные в наборе хранятся в основном только для того, чтобы знать, какие данные есть.

    Типичная операция: скажите, присутствует ли элемент в списке.

  4. 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 я должен использовать?

Это зависит от того, какую проблему вы пытаетесь решить или какие у вас требования.

Примеры:

  1. Хотите, чтобы элементы сортировались при их хранении? HashSet
  2. Вы хотите, чтобы пары (ключ, значение) были сохранены? HashMap
  3. Вы хотите, чтобы порядок элементов при вставке сохранялся? ArrayList, LinkedList
  4. Вы хотите отсортировать ключи в (ключ, значение) пары? - сильный текст
  5. Вы хотите реализовать стек для решения вашей проблемы? - стек
  6. Хотите ли вы иметь доступ FIFO (первым пришел - первым вышел)? - очередь
  7. Вы хотите, чтобы были сохранены только уникальные элементы? - HashSet
  8. Вы хотите разрешить ключу "Нуль" при сохранении (Ключ, Значение)? - HashMap
  9. Хотите ли вы иметь значения NULL для пары (Key, Value)? Хеш-таблица