Какую коллекцию Java я должен использовать?


в этом вопросе Как я могу эффективно выбрать стандартный контейнер библиотеки в C++11? это удобная блок-схема для использования при выборе коллекций C++.

Я думал, что это полезный ресурс для людей, которые не уверены, какие коллекции они должны быть через я пытался найти похожую схему для Java и не смог этого сделать.

какие ресурсы и" шпаргалки " доступны, чтобы помочь людям выбрать правильную коллекцию для использования, когда программирование на Java? Как люди узнают, какие реализации списка, набора и карты они должны использовать?

4 102

4 ответа:

поскольку я не мог найти подобную блок-схему, я решил сделать ее сам.

эта блок-схема не пытается охватить такие вещи, как синхронизированный доступ, потокобезопасность и т. д. или устаревшие коллекции, но она охватывает Стандарт 3 Set s, 3 standard картаS и 2 Стандарт список s.

enter image description here

этот образ был создан для этого ответа и лицензирован под Creative Commons Attribution 4.0 международная лицензия. самая простая атрибуция-это ссылка на этот вопрос или этот ответ.

другие ресурсы

вероятно, наиболее полезной другой ссылкой является следующая страница из документации oracle, которая описывает каждый коллекция.

HashSet vs TreeSet

существует подробное обсуждение того, когда использовать HashSet или TreeSet здесь: Hashset vs Treeset

ArrayList vs LinkedList

подробное обсуждение: когда использовать LinkedList над ArrayList?

сводка основных несинхронных, несинхронизированных коллекций

Collection: интерфейс, представляющий неупорядоченный "мешок" элементов, называемый "элементы". "Следующий" элемент не определен (случайный).

  • Set: интерфейс, представляющий собой Collection без дубликатов.
    • HashSet: A Set при поддержке a Hashtable. Самое быстрое и малое использование памяти, при заказе не имеет значения.
    • LinkedHashSet: A HashSet С добавлением связанного списка для связывания элементов в порядок вставки. "Следующий" элемент-это следующий последний вставленный элемент.
    • TreeSet: A Set где элементы упорядочены по Comparator (обычно естественные заказ). Самое медленное и самое большое использование памяти, но необходимое для компаратор-основанного приказывать.
    • EnumSet: чрезвычайно быстрый и эффективный Set настраивается для одного типа перечисления.
  • List: интерфейс, представляющий собой Collection чьи элементы упорядочены и каждый из них имеет числовой индекс, представляющий его положение, где ноль является первым элементом, и (length - 1) is последний.
    • ArrayList: A List поддерживается массивом, где массив имеет длину (называемую "емкостью"), которая по крайней мере равна количеству элементов ("размер"списка). Когда размер превышает емкость (когда (capacity + 1)-th элемент добавлен), массив воссоздается с новой емкостью (new length * 1.5)--этот отдых быстро, так как он использует System.arrayCopy(). Для удаления и вставки/добавления элементов требуются все соседние элементы (вправо) переместиться в это пространство или из него. Доступ к любому элементу происходит быстро, так как для этого требуется только вычисление (element-zero-address + desired-index * element-size) чтобы найти его местоположение. в большинстве ситуаций, an ArrayList предпочтительнее, чем LinkedList.
    • LinkedList: A List поддерживается набором объектов, каждый из которых связан со своими "предыдущими" и "следующими" соседями. А LinkedList тоже Queue и Deque. Доступ к элементам осуществляется начиная с первого или последнего элемент, и обход до тех пор, пока не будет достигнут нужный индекс. Вставка и удаление, как только желаемый индекс достигается через обход является тривиальным вопросом повторного отображения только непосредственных соседних ссылок, чтобы указать на новый элемент или обойти теперь удаленный элемент.
  • Map: интерфейс, представляющий Collection где каждый элемент имеет идентифицирующий "ключ" --каждый элемент является ключом-значением пара.
    • HashMap: A Map, где ключами являются неупорядоченными, и подкреплены Hashtable.
    • LinkedhashMap: ключи заказываются порядок вставки.
    • TreeMap: A Map где ключи заказываются a Comparator (обычно естественный порядок).
  • Queue: An интерфейс, который представляет собой Collection где элементы, как правило, добавляются в один конец и удаляются из другого (FIFO: first-in, first-out).
  • Stack: интерфейс, который представляет собой Collection где элементы, как правило, добавляются (выталкиваются) и удаляются (выскакивают) с одного и того же конца (LIFO: last-in, first-out).
  • Deque: сокращение от "двойная очередь", обычно произносится как "палуба". Один связанный список, который обычно добавляется и читается только с обоих концов (не с середины).

базовая коллекция схем:

diagram

сравнение вставки элемента с ArrayList и LinkedList:

diagram

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

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

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

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

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

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

  4. карта - это что-то вроде списка, но вместо того, чтобы обращаться к элементам по их целочисленному индексу, вы обращаетесь к ним по их ключ, который каких-либо объект. Как массив в PHP :)

    данные на карте можно найти по ключевым.

    главная разница между набором и картой заключается в том, что в наборе вы поиск данные сами по себе, в то время как на карте купить ключ.

Это просто: если вам нужно хранить значения с ключами, сопоставленными с ними, перейдите к интерфейсу карты, в противном случае используйте Список для значений, которые могут быть дублированы, и, наконец, используйте интерфейс Set, если вы не хотите дублировать значения в своей коллекции.

вот полное объяснение http://javatutorial.net/choose-the-right-java-collection, включая блок-схему и т. д.