Фреймворк коллекций Java
Ещё до Java 2 Java предоставляла специализированные классы. Например: Dictionary, Vector, Stack и Properties — эти классы использовались для хранения групп объектов и манипулирования ими.
Хотя эти классы очень полезны, им не хватает единой основной концепции. По этой причине способ использования класса Vector сильно отличается от способа использования класса Properties.
Фреймворк коллекций был разработан для достижения следующих целей.
-
Фреймворк должен быть высокопроизводительным. Реализации базовых коллекций (динамические массивы, связанные списки, деревья, хеш-таблицы) также должны быть эффективными.
-
Фреймворк позволяет разным типам коллекций работать схожим образом с высокой степенью взаимодействия.
-
Расширения и адаптации коллекции должны быть простыми.
Для этого весь фреймворк коллекций построен вокруг набора стандартных интерфейсов. Вы можете напрямую использовать стандартные реализации этих интерфейсов, такие как:LinkedList, HashSet, иTreeSet, и т. д. Кроме того, вы также можете реализовать собственные коллекции с помощью этих интерфейсов.

Из приведённой выше диаграммы фреймворка коллекций видно, что фреймворк коллекций Java в основном включает два типа контейнеров: один — Collection, который хранит коллекцию элементов; другой — Map, который хранит отображения пар ключ/значение. Интерфейс Collection имеет 3 подтипа: List, Set и Queue. Ниже них находятся некоторые абстрактные классы, а затем конкретные классы реализации. К часто используемым относятсяArrayList、LinkedList、HashSet、LinkedHashSet, HashMap, LinkedHashMap и так далее.
Фреймворк коллекций — это унифицированная архитектура для представления и манипулирования коллекциями. Все фреймворки коллекций содержат следующее:
-
Интерфейсы:
Это абстрактные типы данных, которые представляют коллекции. Например: Collection, List, Set, Map и т. д. Причина, по которой определено несколько интерфейсов, заключается в том, чтобы манипулировать объектами коллекций различными способами. -
Реализации (классы):Это конкретные реализации интерфейсов коллекций. По сути, это переиспользуемые структуры данных, например: ArrayList, LinkedList, HashSet, HashMap.
-
Алгоритмы:Это некоторые полезные вычисления, выполняемые методами в объектах, реализующих интерфейсы коллекций, например: поиск и сортировка. Эти алгоритмы обеспечивают полиморфизм, потому что один и тот же метод может иметь разные реализации на похожих интерфейсах.
Помимо коллекций, фреймворк также определяет несколько интерфейсов и классов Map. Map хранят пары ключ/значение. Хотя Map не являются коллекциями, они полностью интегрированы в коллекции.
Система фреймворка коллекций показана на рисунке ниже.

Фреймворк коллекций Java предоставляет набор высокопроизводительных, простых в использовании интерфейсов и классов. Фреймворк коллекций Java находится в пакете java.util, поэтому при использовании фреймворка коллекций необходимо импортировать этот пакет.
Интерфейсы коллекций
Фреймворк коллекций определяет некоторые интерфейсы. В этом разделе представлен обзор каждого интерфейса:
| Нет. | Описание интерфейса |
|---|---|
| 1 | Интерфейс Collection Collection — самый базовый интерфейс коллекций. Collection представляет группу объектов, то есть элементов Collection. Java не предоставляет классов, которые напрямую наследуются от Collection; предоставляются только субинтерфейсы, наследующие его (такие как List и Set). Интерфейс Collection хранит группу неуникальных, неупорядоченных объектов. |
| 2 | Интерфейс List Интерфейс List — это упорядоченная Collection. С помощью этого интерфейса можно точно контролировать позицию, в которую вставляется каждый элемент, и получать доступ к элементам в List по индексу (позиции элемента в List, аналогично индексу массива). Первый элемент имеет индекс 0, и допускаются повторяющиеся элементы. Интерфейс List хранит группу неуникальных, упорядоченных (в порядке вставки) объектов. |
| 3 | Set Set имеет точно такой же интерфейс, как у Collection, но ведёт себя иначе; Set не хранит повторяющиеся элементы. Интерфейс Set хранит группу уникальных, неупорядоченных объектов. |
| 4 | SortedSet Наследуется от Set и хранит упорядоченную коллекцию. |
| 5 | Map Интерфейс Map хранит группу объектов «ключ-значение» и обеспечивает отображение ключа в значение. |
| 6 | Map.Entry Описывает элемент (пару ключ/значение) в Map. Это внутренний интерфейс Map. |
| 7 | SortedMap Наследуется от Map, сохраняя ключи в порядке возрастания. |
| 8 | Enumeration Это устаревший интерфейс, в котором определены методы, с помощью которых можно перечислять элементы коллекции объектов (получать их по одному). Этот устаревший интерфейс заменён итераторами. |
Различия между Set и List
-
1. Экземпляры интерфейса Set хранят неупорядоченные данные без дубликатов. Экземпляры интерфейса List хранят упорядоченные повторяющиеся элементы.
2. Set имеет низкую эффективность извлечения, но высокую эффективность удаления и вставки; вставка и удаление не вызывают изменения позиций элементов.<К классам реализации относятся HashSet, TreeSet>。
3. List похож на массив и может динамически увеличиваться; длина List автоматически увеличивается в соответствии с длиной фактически хранимых данных. Он имеет высокую эффективность при поиске элементов и низкую эффективность при вставке и удалении, поскольку это вызывает изменение позиций других элементов.<К классам реализации относятся ArrayList, LinkedList, Vector> 。
Классы реализации Collection (классы коллекций)
Java предоставляет набор стандартных классов коллекций, реализующих интерфейс Collection. Некоторые из них являются конкретными классами и могут использоваться напрямую, тогда как другие — абстрактными классами, предоставляющими частичные реализации интерфейса.
Стандартные классы коллекций приведены в следующей таблице:
| Нет. | Описание класса |
|---|---|
| 1 | AbstractCollection Реализует большинство интерфейсов коллекций. |
| 2 | AbstractList Наследует AbstractCollection и реализует большую часть интерфейса List. |
| 3 | AbstractSequentialList Наследует AbstractList и обеспечивает последовательный доступ к элементам данных, а не произвольный доступ. |
| 4 | LinkedList Этот класс реализует интерфейс List и допускает null-элементы. Он в основном используется для создания структур данных в виде связанного списка. В этом классе нет синхронизированных методов. Если несколько потоков одновременно обращаются к List, вы должны самостоятельно реализовать синхронизацию доступа. Решение — создать синхронизированный List при создании List. Например: List list=Collections.synchronizedList(newLinkedList(...)); LinkedList имеет низкую эффективность поиска. |
| 5 | ArrayList Этот класс также реализует интерфейс List и реализует массив переменного размера, обеспечивая лучшую производительность при произвольном доступе к элементам и их обходе. Этот класс также несинхронизирован, и его не следует использовать в многопоточных ситуациях. ArrayList увеличивается на 50% от текущей длины, а эффективность вставки/удаления низкая. |
| 6 | AbstractSet Наследует AbstractCollection и реализует большую часть интерфейса Set. |
| 7 | HashSet Этот класс реализует интерфейс Set. Дублирующиеся элементы не допускаются, порядок элементов в множестве не гарантируется, а элементы со значением null допускаются, но не более одного. |
| 8 | LinkedHashSet Имеет предсказуемый порядок итерацииSetРеализация интерфейса на основе хеш-таблицы и связного списка. |
| 9 | TreeSet Этот класс реализует интерфейс Set и может реализовывать сортировку и другие функции. |
| 10 | AbstractMap Реализует большую часть интерфейса Map. |
| 11 | HashMap
HashMap — это хеш-таблица; её хранимое содержимое — сопоставления пар ключ-значение. Этот класс реализует интерфейс Map, хранит данные в соответствии со значением HashCode ключа, имеет очень высокую скорость доступа, допускает не более одной записи с ключом null и не поддерживает синхронизацию потоков. |
| 12 | TreeMap
Наследует AbstractMap и использует дерево. |
| 13 | WeakHashMap
Наследует класс AbstractMap и использует хеш-таблицу со слабыми ключами. |
| 14 | LinkedHashMap
Наследует HashMap и сортирует элементы, используя их естественный порядок. |
| 15 | IdentityHashMap
Наследует класс AbstractMap и использует равенство ссылок при сравнении документов. |
Ранее в руководстве были рассмотрены классы, определённые в пакете java.util, как показано ниже:
| Нет. | Описание класса |
|---|---|
| 1 | Вектор
Этот класс очень похож на ArrayList, но этот класс синхронизирован и может использоваться в многопоточных ситуациях. Этот класс позволяет задавать стандартную длину роста, а стандартный способ расширения — увеличение в 2 раза от исходного. |
| 2 | Стек
Stack — подкласс Vector; он реализует стандартный стек (последним пришёл — первым вышел). |
| 3 | Словарь
Класс Dictionary — это абстрактный класс, используемый для хранения пар ключ/значение, и его функция аналогична классу Map. |
| 4 | Hashtable
Hashtable — подкласс класса Dictionary и находится в пакете java.util. |
| 5 | Свойства
Properties наследует от Hashtable и представляет постоянный набор свойств. В списке свойств каждый ключ и соответствующее ему значение являются строками. |
| 6 | BitSet Класс BitSet создаёт специальный тип массива для хранения битовых значений. Размер массива в BitSet будет увеличиваться по мере необходимости. |
Алгоритмы коллекций
Фреймворк коллекций определяет несколько алгоритмов, которые можно использовать с коллекциями и картами. Эти алгоритмы определены как статические методы классов коллекций.
При попытке сравнить несовместимые типы некоторые методы могут выбрасывать ClassCastException. При попытке изменить неизменяемую коллекцию выбрасывается UnsupportedOperationException.
Коллекции определяют три статические переменные: EMPTY_SET, EMPTY_LIST и EMPTY_MAP. Все эти переменные неизменяемы.
| Порядковый номер | Описание алгоритмов |
|---|---|
| 1 |
Алгоритмы коллекций Ниже приведён список всех реализаций алгоритмов. |
Как использовать итераторы
Обычно вы захотите перебрать элементы в коллекции. Например, вывести каждый элемент коллекции.
Как правило, для обхода массивов используется цикл for или расширенный цикл for. Эти два метода также можно использовать в фреймворке коллекций, но есть другой метод, использующий итератор для обхода фреймворка коллекций. Это объект, реализующийIteratorинтерфейс Iterator или интерфейс ListIterator.
Итераторы позволяют получать или удалять элементы коллекции с помощью цикла. ListIterator наследует Iterator, позволяя выполнять двунаправленный обход списков и изменять элементы.
| Порядковый номер | Описание методов Iterator |
|---|---|
| 1 |
Использование Java Iterator Здесь на примерах перечислены все методы, предоставляемые интерфейсами Iterator и ListIterator. |
Обход ArrayList
Пример
Анализ:
Все три метода используются для обхода коллекции ArrayList. Третий метод использует итератор, что позволяет не беспокоиться о превышении длины коллекции во время обхода.
Обход Map
Пример
Как использовать компараторы
TreeSet и TreeMap хранят элементы в отсортированном порядке. Однако именно компаратор точно определяет, какой порядок сортировки используется.
Этот интерфейс позволяет сортировать коллекцию разными способами.
| Порядковый номер | Описание метода Comparator |
|---|---|
| 1 | Использование Java Comparator Здесь на примерах перечислены все методы, предоставляемые интерфейсом Comparator. |
Итог
Фреймворк коллекций Java предоставляет программистам готовые структуры данных и алгоритмы для работы с ними.
Коллекция — это объект, который может содержать ссылки на другие объекты. Интерфейсы коллекций объявляют операции, которые можно выполнять с каждым типом коллекции.
Классы и интерфейсы фреймворка коллекций находятся в пакете java.util.
После добавления любого объекта в класс коллекции он автоматически преобразуется в тип Object, поэтому при извлечении требуется принудительное преобразование типа.
Другие расширения