Java. Загальні відомості про Java Collections Framework

Загальні відомості про Java Collections Framework


Зміст


Пошук на інших ресурсах:

1. Пакет java.util. Огляд колекцій

Пакет java.util містить широкий спектр засобів, що дають потужні функціональні можливості для розробки програм мовою Java. Однією з цих можливостей є керування та організація роботи з наборами (групами) об’єктів, які ще називаються колекціями. У мові Java колекції були впроваджені починаючи з версії J2SE 1.2. Колекції утворюють так званий каркас, який називається Java Collection Framework і представляє собою складну ієрархію класів та інтерфейсів.

У каркасі колекцій реалізовано набір стандартних операцій над різними відомими видами груп об’єктів, до яких належать:

  • черга;
  • множина;
  • список;
  • масив;
  • хеш-таблиця;
  • дерево.

Основні причини (переваги) розробки каркасу колекцій:

  • уникнення “ручного” програмування доступу до організованих даних та використання готових рішень;
  • забезпечення високої (максимальної) продуктивності при роботі з великими групами даних;
  • забезпечення єдиного способу керування для всіх наборів даних;
  • за необхідністю, забезпечення зручного механізму розширення колекцій та/або їх адаптації з допомогою використання набору стандартних інтерфейсів;
  • легкість створення власних колекцій, що базуються на використанні існуючого каркасу;
  • забезпечення інтеграції з такими базовими структурами даних як масиви.

Весь пакет роботи з колекціями включає наступні змістовні елементи:

  • інтерфейси, які забезпечують можливість розширення існуючого функціоналу на власний розсуд;
  • класи – містять засоби організації роботи зі стеками, чергами, масивами тощо;
  • алгоритми – набір статичних методів, що реалізують стандартні операції над колекціями (сортування, пошук тощо);
  • ітератори – забезпечують єдиний стандартизований спосіб почергового доступу до елементів колекції.

Починаючи з версії JDK 5 у механізм роботи з колекціями впроваджені наступні нововведення:

  • підтримка узагальнень (всі колекції є узагальненими);
  • автоматичне упакування та розпакування;
  • організація циклу for в стилі for each. Це означає, що всі класи в каркасі колекцій підтримують інтерфейс Iterable.

Пітримка узагальнень дозволила забезпечити типову безпеку в колекціях. Завдяки узагальненням можна явно вказувати тип даних, що зберігаються в колекції. Це дає змогу уникнути важковловимих помилок під час виконання.

В колекціях можна зберігати тільки посилання а не значення примітивних типів. Це означає, що для створення колекції цілих чисел потрібно вказувати тип-оболонку Integer замість примітивного типу int. У противному випадку компілятор видасть помилку. При цьому упакування та авторозпакування з int в Integer і навпаки відбувається автоматично. Більш детально про особливості автоупакування та авторозпакування в Java можна прочитати тут.

 

2. Стандартні інтерфейси. Перелік

Розширення колекцій та їх адаптація забезпечується з допомогою реалізації стандартних інтерфейсів, що включені в Java Collection Framework. До цих інтерфейсів належать:

  • Collection – базовий інтерфейс, який знаходиться в вершині ієрархії колекцій;
  • Queue – реалізація односторонньої черги, в якій елементи видаляться тільки з початку черги. Цей інтерфейс розширює інтерфейс Collection;
  • Deque – розширює інтерфейс Queue з метою організації двохсторонньої черги;
  • List – розширює інтерфейс Collection для керування послідовностями (списками об’єктів);
  • Set – реалізує множину шляхом розширення інтерфейсу Collection. У множині немає однакових елементів (кожен елемент є зустрічається тільки 1 раз);
  • SortedSet – розширює інтерфейс Set додаючи сортування. Отримується відсортованм множина;
  • NavigableSet – розширює інтерфейс SortedSet. Забезпечує отримання елементів за першим співпадінням.

 

3. Класи колекцій. Перелік

У Java Collection Framework реалізовано ряд стандартних класів колекцій, які реалізують інтерфейси колекцій (див. п. 2.). Стандартні класи колекцій поділяються на 2 групи:

  • класи, які представляють повну реалізацію відповідних інтерфейсів. Ці класи можна використовувати безпосередньо;
  • класи, що є шаблонами. Ці класи служать основою для створення конкретних колекцій.

Хоча класи колекцій не є синхронізовані, допускається подальша синхронізація цих класів.

Перелік стандартних класів колекцій наступний:

  • AbstractCollection – забезпечує реалізацію більшої частини інтерфейсу Collection;
  • AbstractList – успадкований від класу AbstractCollection та реалізує більшу частину інтерфейсу List;
  • AbstractQueue – успадкований від класу AbstractCollection та реалізує частину інтерфейсу Queue;
  • AbstractSequentalList – успадковує (розширює) клас AbstractList для застосування в колекціях, що використовують послідовності при доступі до елементів;
  • LinkedList – успадкований від класу AbstractSequentialList і реалізує зв’язаний список;
  • ArrayList – клас, що успадкований від AbstractList і реалізує динамічний масив;
  • ArrayDeque – успадкований від AbstractCollection і реалізує інтерфейс Deque;
  • AbstractSet – успадкований від класу AbstractCollection і реалізує більшу частину інтерфейсу Set;
  • EnumSet – успадкований від класу AbstractSet для застосування разом з елементами типу enum;
  • HashSet – успадкований від класу AbstractSet. Цей клас реалізує так звані хеш-таблиці, елементи яких представляють собою пари key:value (ключ:значення);
  • LinkedHashSet – клас, що успадкований з HashSet і характерний тим, що елементи вводяться у визначеному порядку;
  • PriorityQueue – успадкований з класу AbstractQueue і реалізує чергу з пріоритетами;
  • TreeSet – успадкований з класу AbstractSet. Цей клас реалізує множину, яка зберігається у вигляді деревовидної структури.

 

4. Алгоритми

Алгоритми визначені в класі Collections у вигляді статичних методів і призначені для оперування колекціями. Оскільки алгоритми це статичні методи, то вони доступні усім класам колекцій, тобто є спільними для використання.

Нижче наведено перелік алгоритмів, що можуть застосовуватись до колекцій:

  • addAll – вставляє вказані елементи в задану колекцію;
  • asLifoQueue – конвертує колекцію у стек;
  • binarySearch – реалізує пошук значення у заданому списку;
  • checkedCollection, checkedList, checkedMap, checkedNavigableMap, checkedNavigableSet, checkedQueue, checkedSet, checkedSortedMap, checkedSortedSet – повертають динамічно типізоване представлення відображення для списків, карт відображень, множин, черг;
  • copy – копіює елементи з одного списку в інший;
  • disjoint – порівнює елементи двох колекцій;
  • emptyEnumeration – повертає пусте зчислення;
  • emptyIterator – повертає пустий ітератор;
  • emptyList, emptyListIterator – повертає пустий список та пустий ітератор списку;
  • emptyMap – повертає пусте відображення типу Map;
  • emptyNavigableMap – повертає незмінюване пусте відображення типу, що виводиться з інтерфейсу NavigableMap;
  • emptySet – повертає незмінювану пусту множину;
  • emptyNavigableSet – повертає незмінювану пусту множину типу NavigableSet;
  • emptySortedMap, emptySortedSet – повертають незмінюване пусте відображення типу, що отримується з інтерфейсів SortedMap та SortedSet;
  • enumeration – повертає зчислення елементів на основі заданої колекції;
  • fill – заповнює заданий список значенням об’єкту;
  • frequency – підраховує кількість входжень заданого об’єкту в заданій колекції;
  • indexOfSubList – повертає позицію першого входження заданого підсписку в списку;
  • lastIndexOfSubList – повертає позицію останнього входження заданого підсписку в списку;
  • list – повертає масив типу ArrayList на основі заданого зчислення;
  • max – повертає максимальний елемент з заданої колекції;
  • min – повертає мінімальний елемент в колекції;
  • newSetFromMap – повертає множину, яка утворюється на основі заданого відображення;
  • nCopies – повертає список, що містить задану кількість копій заданого об’єкту;
  • replaceAll – здійснює заміну всіх входжень заданого елементу на нове значення у заданому списку;
  • reverse – реверсує заданий список;
  • reverseOrder – повертає компаратор, що є зворотнім до заданого;
  • rotate – реалізує зміщення заданого списку на задану кількість позицій;
  • shuffle – реалізує перемішування (випадковим чином) елементів заданого списку;
  • singleton – повертає заданий об’єкт у вигляді незмінюваної множини;
  • singletonList – повертає заданий об’єкт у вигляді незмінюваного списку;
  • singletonMap – конвертує пару key:value у відображення;
  • sort – сортує елементи заданого списку;
  • swap – змінює місцями елементи заданого списку;
  • synchronizedCollection, synchronizedList, synchronizedMap, synchronizedNavigableMap, synchronizedNavigableSet, synchronizedSet, synchronizedSortedMap, synchronizedSortedSet – повертають синхронізовану послідовність яка є потокобезпечною. Обробляються колекції, списки, відображення, множини;
  • unmodifialbleCollection, unmodifiableList, unmodifiableMap, unmodifiableNavigableSet, unmodifiableSet, unmodifiableSortedMap, unmodifiableSortedSet – на основі заданої послідовності повертають незмінювану послідовність. Розглядаються реалізації для колекцій, списків, відображень, множин.

 

5. Ітератори

Ітератори – це спеціальні класи, які реалізують інтерфейси для стандартизованого доступу до окремих елементів колекції. Ітератори забезпечують спосіб перебору вмісту колекцій. Будь-який ітератор – це об’єкт класу, що реалізує один з двох інтерфейсів:

  • Iterator – забезпечує організацію циклу для перебору колекції з доступом до елементів цієї колекції;
  • ListIterator – успадкований від інтерфейсу Iterator і реалізує двохсторонній обхід списку з доступом до елементів.

Оголошення інтерфейсів Iterator та ListIterator має вигляд

interface Iterator<E>
interface ListIterator<E>

тут

  • E – тип об’єктів, які потрібно перебрати.

 


Споріднені теми