logo

Колекції на Java

Будь-яка група окремих об’єктів, які представлені як одне ціле, відома як колекція об’єктів Java. У Java окрема структура під назвою the Структура колекції було визначено в JDK 1.2, який містить усі класи колекції Java та інтерфейс.

У Java інтерфейс колекції ( java.util.Collection ) та інтерфейс карти ( java.util.Map ) є двома основними кореневими інтерфейсами класів колекції Java.



Що ви повинні дізнатися про колекції Java?

  • Інтерфейс SortedSet
    • Інтерфейс NavigableSet
    • TreeSet
    • Клас ConcurrentSkipListSet
  • Інтерфейс карти
    • Інтерфейс SortedMap
    • Інтерфейс NavigableMap
    • Інтерфейс ConcurrentMap
    • Клас TreeMap
    • Клас AbstractMap
    • Клас ConcurrentHashMap
    • Клас EnumMap
    • Клас HashMap
    • Клас IdentityHashMap
    • Клас LinkedHashMap
    • Клас HashTable
    • Властивості Класу
  • Інші важливі поняття
    • Як конвертувати HashMap в ArrayList
    • Довільно виберіть елементи зі списку
    • Як додати всі елементи з колекції до ArrayList
    • Перетворення Java Maps на List
    • Перетворення масиву в ArrayList
    • Перетворення ArrayList в Array
    • Відмінності між Array і ArrayList

Що таке Framework в Java?

Фреймворк — це набір класів та інтерфейсів, які забезпечують готову архітектуру. Щоб реалізувати нову функцію або клас, немає необхідності визначати структуру. Однак оптимальний об’єктно-орієнтований дизайн завжди включає структуру з набором класів, щоб усі класи виконували одне й те саме завдання.

Потрібна окрема структура збирання в Java

До представлення Collection Framework (або до JDK 1.2) стандартними методами групування об’єктів Java (або колекцій) були Масиви або Вектори , або Хеш-таблиці . Усі ці колекції не мали спільного інтерфейсу. Тому, незважаючи на те, що основна мета всіх збірок однакова, реалізація всіх цих колекцій була визначена незалежно і не мала жодної кореляції між собою. Крім того, користувачам дуже важко запам'ятати все різне методи , синтаксис і конструктори присутні в кожному класі колекції.
Давайте зрозуміємо це на прикладі додавання елемента в хеш-таблицю та вектор.



алгоритм сортування купи

приклад:

Java






// Java program to demonstrate> // why collection framework was needed> import> java.io.*;> import> java.util.*;> class> CollectionDemo {> >public> static> void> main(String[] args)> >{> >// Creating instances of the array,> >// vector and hashtable> >int> arr[] =>new> int>[] {>1>,>2>,>3>,>4> };> >Vector v =>new> Vector();> >Hashtable h =>new> Hashtable();> >// Adding the elements into the> >// vector> >v.addElement(>1>);> >v.addElement(>2>);> >// Adding the element into the> >// hashtable> >h.put(>1>,>'geeks'>);> >h.put(>2>,>'4geeks'>);> >// Array instance creation requires [],> >// while Vector and hastable require ()> >// Vector element insertion requires addElement(),> >// but hashtable element insertion requires put()> >// Accessing the first element of the> >// array, vector and hashtable> >System.out.println(arr[>0>]);> >System.out.println(v.elementAt(>0>));> >System.out.println(h.get(>1>));> >// Array elements are accessed using [],> >// vector elements using elementAt()> >// and hashtable elements using get()> >}> }>

>

>

Вихід

1 1 geeks>

Як ми бачимо, жодна з цих колекцій (масив, вектор або хеш-таблиця) не реалізує стандартний інтерфейс доступу до членів, тому програмістам було дуже важко написати алгоритми, які можуть працювати для всіх видів колекцій. Іншим недоліком є ​​те, що більшість методів «Вектора» є остаточними, тобто ми не можемо розширити клас «Вектор» для реалізації подібного типу колекції. Тому розробники Java вирішили розробити загальний інтерфейс для вирішення вищезгаданих проблем і представили Framework Collection у публікації JDK 1.2, у якій як застарілі вектори, так і хеш-таблиці були змінені для відповідності Framework Collection.

Переваги Java Collection Framework

Оскільки відсутність структури збору призвело до вищезазначеного набору недоліків, нижче наведено переваги структури збору.

  1. Послідовний API: API має базовий набір інтерфейсів, наприклад Колекція , встановити , Список , або Карта , усі класи (ArrayList, LinkedList, Vector тощо), які реалізують ці інтерфейси, мають дещо загальний набір методів.
  2. Зменшує зусилля програмування: Програмісту не потрібно турбуватися про дизайн колекції, він може зосередитися на її найкращому використанні у своїй програмі. Таким чином, базова концепція об’єктно-орієнтованого програмування (тобто абстракції) була успішно реалізована.
  3. Збільшує швидкість і якість програми: Підвищує продуктивність, надаючи високопродуктивні реалізації корисних структур даних і алгоритмів, оскільки в цьому випадку програмісту не потрібно думати про найкращу реалізацію конкретної структури даних. Він може просто використати найкращу реалізацію, щоб різко підвищити продуктивність свого алгоритму/програми.

Ієрархія Framework колекції в Java

Пакет службових програм (java.util) містить усі класи та інтерфейси, необхідні для структури колекції. Структура колекції містить інтерфейс під назвою ітерований інтерфейс, який надає ітератору можливість проходити всі колекції. Цей інтерфейс розширено основним інтерфейсом колекції, який виступає коренем для структури колекції. Усі колекції розширюють цей інтерфейс колекції, тим самим розширюючи властивості ітератора та методи цього інтерфейсу. Наступний малюнок ілюструє ієрархію структури колекції.

Перш ніж розуміти різні компоненти у вищезазначеній структурі, давайте спочатку розберемося з класом та інтерфейсом.

  • Клас : Клас — це визначений користувачем план або прототип, з якого створюються об’єкти. Він представляє набір властивостей або методів, які є загальними для всіх об'єктів одного типу.
  • Інтерфейс : Як і клас, інтерфейс може мати методи та змінні, але методи, оголошені в інтерфейсі, за умовчанням є абстрактними (тільки підпис методу, ніхто). Інтерфейси визначають, що повинен робити клас, а не як. Це схема класу.

Методи інтерфейсу колекції

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

метод

опис

додати (об'єкт) Цей метод використовується для додавання об’єкта до колекції.
addAll(Collection c) Цей метод додає всі елементи з даної колекції до цієї колекції.
очистити() Цей метод видаляє всі елементи з цієї колекції.
містить (об'єкт o) Цей метод повертає true, якщо колекція містить вказаний елемент.
міститьВсе(Колекція c) Цей метод повертає true, якщо колекція містить усі елементи даної колекції.
дорівнює (об'єкт o) Цей метод порівнює вказаний об’єкт із цією колекцією на рівність.
hashCode() Цей метод використовується для повернення значення хеш-коду для цієї колекції.
пусто() Цей метод повертає true, якщо ця колекція не містить елементів.
ітератор() Цей метод повертає ітератор для елементів цієї колекції.
max()
Цей метод використовується для повернення максимального значення, наявного в колекції.
parallelStream() Цей метод повертає паралельний потік із цією колекцією як джерелом.
видалити (об'єкт o) Цей метод використовується для видалення даного об'єкта з колекції. Якщо є повторювані значення, цей метод видаляє перше входження об’єкта.
removeAll(Collection c) Цей метод використовується для видалення з колекції всіх об’єктів, згаданих у даній колекції.
removeIf (фільтр предикатів) Цей метод використовується для видалення всіх елементів цієї колекції, які задовольняють задане присудок .
retainAll(Collection c) Цей метод використовується для збереження лише тих елементів цієї колекції, які містяться у вказаній колекції.
розмір() Цей метод використовується для повернення кількості елементів у колекції.
spliterator() Цей метод використовується для створення a Розплітор над елементами цієї колекції.
потік() Цей метод використовується для повернення послідовного потоку з цією колекцією як джерелом.
toArray() Цей метод використовується для повернення масиву, що містить усі елементи цієї колекції.

Інтерфейси, які розширюють інтерфейс колекцій Java

Структура колекції містить кілька інтерфейсів, де кожен інтерфейс використовується для зберігання певного типу даних. Нижче наведено інтерфейси, присутні в рамках.

1. Ітерований інтерфейс

Це кореневий інтерфейс для всієї колекції. Інтерфейс колекції розширює ітераційний інтерфейс. Тому за своєю суттю всі інтерфейси та класи реалізують цей інтерфейс. Основною функціональністю цього інтерфейсу є надання ітератора для колекцій. Таким чином, цей інтерфейс містить лише один абстрактний метод, яким є ітератор. Це повертає

Iterator iterator();>

2. Інтерфейс колекції

Цей інтерфейс розширює ітераційний інтерфейс і реалізований усіма класами в рамках колекції. Цей інтерфейс містить усі основні методи, які є в кожній колекції, як-от додавання даних до колекції, видалення даних, очищення даних тощо. Усі ці методи реалізовано в цьому інтерфейсі, оскільки ці методи реалізуються всіма класами незалежно від їх стилю реалізації. Крім того, наявність цих методів у цьому інтерфейсі гарантує, що імена методів є універсальними для всіх колекцій. Таким чином, коротко кажучи, ми можемо сказати, що цей інтерфейс створює фундамент, на якому реалізуються класи колекції.

3. Інтерфейс списку

Це дочірній інтерфейс інтерфейсу колекції. Цей інтерфейс призначений для даних типу списку, в якому ми можемо зберігати всі впорядковані колекції об’єктів. Це також дозволяє дублювати дані в ньому. Цей інтерфейс списку реалізовано різними класами, такими як ArrayList, Vector, Stack тощо. Оскільки всі підкласи реалізують список, ми можемо створити об’єкт списку за допомогою будь-якого з цих класів.

Наприклад:

List al = new ArrayList ();  List ll = new LinkedList ();  List v = new Vector ();  Where T is the type of the object>

Класи, які реалізують інтерфейс List, такі:

i). ArrayList

ArrayList надає нам динамічні масиви в Java. Хоча це може бути повільніше, ніж стандартні масиви, але може бути корисним у програмах, де потрібно багато маніпулювати масивом. Розмір ArrayList автоматично збільшується, якщо колекція зростає, або зменшується, якщо об’єкти видаляються з колекції. Java ArrayList дозволяє нам випадково отримувати доступ до списку. ArrayList не можна використовувати для клас обгортки для таких випадків.

Давайте розберемо ArrayList на наступному прикладі:

Java




// Java program to demonstrate the> // working of ArrayList> import> java.io.*;> import> java.util.*;> class> GFG {> >// Main Method> >public> static> void> main(String[] args)> >{> >// Declaring the ArrayList with> >// initial size n> >ArrayList al =>new> ArrayList();> >// Appending new elements at> >// the end of the list> >for> (>int> i =>1>; i <=>5>; i++)> >al.add(i);> >// Printing elements> >System.out.println(al);> >// Remove element at index 3> >al.remove(>3>);> >// Displaying the ArrayList> >// after deletion> >System.out.println(al);> >// Printing elements one by one> >for> (>int> i =>0>; i System.out.print(al.get(i) + ' '); } }>

>

>

Вихід

[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>

ii). LinkedList

Клас LinkedList є реалізацією Давайте розберемо LinkedList на наступному прикладі:

Java




// Java program to demonstrate the> // working of LinkedList> import> java.io.*;> import> java.util.*;> class> GFG {> >// Main Method> >public> static> void> main(String[] args)> >{> >// Declaring the LinkedList> >LinkedList ll =>new> LinkedList();> >// Appending new elements at> >// the end of the list> >for> (>int> i =>1>; i <=>5>; i++)> >ll.add(i);> >// Printing elements> >System.out.println(ll);> >// Remove element at index 3> >ll.remove(>3>);> >// Displaying the List> >// after deletion> >System.out.println(ll);> >// Printing elements one by one> >for> (>int> i =>0>; i System.out.print(ll.get(i) + ' '); } }>

>

>

Вихід

[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>

iii). Вектор

Вектор надає нам динамічні масиви в Java. Хоча це може бути повільніше, ніж стандартні масиви, але може бути корисним у програмах, де потрібно багато маніпулювати масивом. Це ідентично ArrayList з точки зору реалізації. Однак основна відмінність між вектором і ArrayList полягає в тому, що Vector синхронізований, а ArrayList — несинхронізований.

Давайте розберемо вектор на прикладі:

Java




// Java program to demonstrate the> // working of Vector> import> java.io.*;> import> java.util.*;> class> GFG {> >// Main Method> >public> static> void> main(String[] args)> >{> >// Declaring the Vector> >Vector v =>new> Vector();> >// Appending new elements at> >// the end of the list> >for> (>int> i =>1>; i <=>5>; i++)> >v.add(i);> >// Printing elements> >System.out.println(v);> >// Remove element at index 3> >v.remove(>3>);> >// Displaying the Vector> >// after deletion> >System.out.println(v);> >// Printing elements one by one> >for> (>int> i =>0>; i System.out.print(v.get(i) + ' '); } }>

>

>

Вихід

[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>

iv). Стек

Клас стека моделює та реалізуєостанній прийшов-перший вийшов. На додаток до основних операцій push і pop, клас надає ще три функції, порожню, пошук і peek. Клас також може називатися підкласом Vector.

Давайте розберемо стек на прикладі:

Java




// Java program to demonstrate the> // working of a stack> import> java.util.*;> public> class> GFG {> >// Main Method> >public> static> void> main(String args[])> >{> >Stack stack =>new> Stack();> >stack.push(>'Geeks'>);> >stack.push(>'For'>);> >stack.push(>'Geeks'>);> >stack.push(>'Geeks'>);> >// Iterator for the stack> >Iterator itr = stack.iterator();> >// Printing the stack> >while> (itr.hasNext()) {> >System.out.print(itr.next() +>' '>);> >}> >System.out.println();> >stack.pop();> >// Iterator for the stack> >itr = stack.iterator();> >// Printing the stack> >while> (itr.hasNext()) {> >System.out.print(itr.next() +>' '>);> >}> >}> }>

>

>

Вихід

Geeks For Geeks Geeks Geeks For Geeks>

Примітка: Stack є підкласом Vector і застарілим класом. Це потокобезпечне, що може бути накладним у середовищі, де потокова безпека не потрібна. Альтернативою Stack є використання ArrayDequeue який не є потоково безпечним і має швидшу реалізацію масиву.

4. Інтерфейс черги

Як випливає з назви, інтерфейс черги підтримує порядок FIFO (першим прийшов, першим вийшов), подібний до лінії черги в реальному світі. Цей інтерфейс призначений для зберігання всіх елементів, де порядок елементів має значення. Наприклад, щоразу, коли ми намагаємося забронювати квиток, квитки продаються в порядку черги. Таким чином, квиток отримує той, чия заявка першою прийде в чергу. Існують різні класи, як PriorityQueue , ArrayDeque , тощо. Оскільки всі ці підкласи реалізують чергу, ми можемо створити екземпляр об’єкта черги з будь-яким із цих класів.

Наприклад:

Queue pq = new PriorityQueue ();  Queue ad = new ArrayDeque ();  Where T is the type of the object.>

Найбільш часто використовуваною реалізацією інтерфейсу черги є PriorityQueue.

Пріоритетна черга

PriorityQueue використовується, коли об’єкти мають оброблятися на основі пріоритету. Відомо, що черга працює за алгоритмом «перший прийшов-перший вийшов», але іноді елементи черги потрібно обробляти відповідно до пріоритету, і в цих випадках використовується цей клас. PriorityQueue базується на купі пріоритетів. Елементи пріоритетної черги впорядковуються відповідно до природного порядку або за a компаратор надається під час побудови черги, залежно від того, який конструктор використовується.

Розберемо пріоритетну чергу на прикладі:

Java




// Java program to demonstrate the working of> // priority queue in Java> import> java.util.*;> class> GfG {> >// Main Method> >public> static> void> main(String args[])> >{> >// Creating empty priority queue> >PriorityQueue pQueue> >=>new> PriorityQueue();> >// Adding items to the pQueue using add()> >pQueue.add(>10>);> >pQueue.add(>20>);> >pQueue.add(>15>);> >// Printing the top element of PriorityQueue> >System.out.println(pQueue.peek());> >// Printing the top element and removing it> >// from the PriorityQueue container> >System.out.println(pQueue.poll());> >// Printing the top element again> >System.out.println(pQueue.peek());> >}> }>

>

>

Вихід

10 10 15>

5. І інтерфейс

Це дуже незначна варіація Наприклад:

Deque ad = new ArrayDeque ();  Where T is the type of the object.>

Клас, який реалізує інтерфейс deque, це ArrayDeque.

ArrayDeque

Клас ArrayDeque, реалізований у фреймворку колекції, надає нам спосіб застосування масиву змінного розміру. Це особливий вид масиву, який росте і дозволяє користувачам додавати або видаляти елементи з обох сторін черги. Двохканальні масиви не мають обмежень по місткості, і вони зростають у міру необхідності для підтримки використання.

Давайте розберемо ArrayDeque на прикладі:

Java




// Java program to demonstrate the> // ArrayDeque class in Java> import> java.util.*;> public> class> ArrayDequeDemo {> >public> static> void> main(String[] args)> >{> >// Initializing an deque> >ArrayDeque de_que> >=>new> ArrayDeque(>10>);> >// add() method to insert> >de_que.add(>10>);> >de_que.add(>20>);> >de_que.add(>30>);> >de_que.add(>40>);> >de_que.add(>50>);> >System.out.println(de_que);> >// clear() method> >de_que.clear();> >// addFirst() method to insert the> >// elements at the head> >de_que.addFirst(>564>);> >de_que.addFirst(>291>);> >// addLast() method to insert the> >// elements at the tail> >de_que.addLast(>24>);> >de_que.addLast(>14>);> >System.out.println(de_que);> >}> }>

>

>

Вихід

[10, 20, 30, 40, 50] [291, 564, 24, 14]>

6. Встановити інтерфейс

Набір — це невпорядкована сукупність об’єктів, у якій не можна зберігати повторювані значення. Ця колекція використовується, коли ми хочемо уникнути дублювання об’єктів і хочемо зберігати лише унікальні об’єкти. Цей інтерфейс набору реалізовано різними класами, такими як HashSet, TreeSet, LinkedHashSet тощо. Оскільки всі підкласи реалізують набір, ми можемо створити екземпляр об’єкта набору за допомогою будь-якого з цих класів.

Наприклад:

Set hs = new HashSet ();  Set lhs = new LinkedHashSet ();  Set ts = new TreeSet ();  Where T is the type of the object.>

Нижче наведено класи, які реалізують інтерфейс Set:

i). HashSet

Клас HashSet є невід’ємною реалізацією структури даних хеш-таблиці. Об’єкти, які ми вставляємо в HashSet, не гарантують, що вони будуть вставлені в тому самому порядку. Об’єкти вставляються на основі їх хеш-коду. Цей клас також дозволяє вставляти елементи NULL. Давайте розберемо HashSet на прикладі:

Java




// Java program to demonstrate the> // working of a HashSet> import> java.util.*;> public> class> HashSetDemo {> >// Main Method> >public> static> void> main(String args[])> >{> >// Creating HashSet and> >// adding elements> >HashSet hs =>new> HashSet();> >hs.add(>'Geeks'>);> >hs.add(>'For'>);> >hs.add(>'Geeks'>);> >hs.add(>'Is'>);> >hs.add(>'Very helpful'>);> >// Traversing elements> >Iterator itr = hs.iterator();> >while> (itr.hasNext()) {> >System.out.println(itr.next());> >}> >}> }>

>

>

Вихід

Very helpful Geeks For Is>

ii). LinkedHashSet

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

Давайте розберемо LinkedHashSet на прикладі:

Java




// Java program to demonstrate the> // working of a LinkedHashSet> import> java.util.*;> public> class> LinkedHashSetDemo {> >// Main Method> >public> static> void> main(String args[])> >{> >// Creating LinkedHashSet and> >// adding elements> >LinkedHashSet lhs> >=>new> LinkedHashSet();> >lhs.add(>'Geeks'>);> >lhs.add(>'For'>);> >lhs.add(>'Geeks'>);> >lhs.add(>'Is'>);> >lhs.add(>'Very helpful'>);> >// Traversing elements> >Iterator itr = lhs.iterator();> >while> (itr.hasNext()) {> >System.out.println(itr.next());> >}> >}> }>

>

>

Вихід

Geeks For Is Very helpful>

7. Інтерфейс відсортованого набору

Цей інтерфейс дуже схожий на встановлений інтерфейс. Єдина відмінність полягає в тому, що цей інтерфейс має додаткові методи, які підтримують порядок елементів. Інтерфейс відсортованого набору розширює інтерфейс набору та використовується для обробки даних, які потрібно відсортувати. Клас, який реалізує цей інтерфейс – TreeSet. Оскільки цей клас реалізує SortedSet, ми можемо створити екземпляр об’єкта SortedSet за допомогою цього класу.

Наприклад:

SortedSet ts = new TreeSet ();  Where T is the type of the object.>

Клас, який реалізує інтерфейс відсортованого набору, це TreeSet.

TreeSet

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

Розберемо TreeSet на прикладі:

Java




// Java program to demonstrate the> // working of a TreeSet> import> java.util.*;> public> class> TreeSetDemo {> >// Main Method> >public> static> void> main(String args[])> >{> >// Creating TreeSet and> >// adding elements> >TreeSet ts =>new> TreeSet();> >ts.add(>'Geeks'>);> >ts.add(>'For'>);> >ts.add(>'Geeks'>);> >ts.add(>'Is'>);> >ts.add(>'Very helpful'>);> >// Traversing elements> >Iterator itr = ts.iterator();> >while> (itr.hasNext()) {> >System.out.println(itr.next());> >}> >}> }>

>

>

Вихід

For Geeks Is Very helpful>

8. Інтерфейс карти

Карта — це структура даних, яка підтримує пару ключ-значення для відображення даних. Цей інтерфейс не підтримує повторювані ключі, оскільки той самий ключ не може мати кілька зіставлень, однак він допускає повторювані значення в різних ключах. Карта корисна, якщо є дані і ми хочемо виконувати операції на основі ключа. Цей інтерфейс карти реалізований різними класами, наприклад HashMap , TreeMap і т. д. Оскільки всі підкласи реалізують карту, ми можемо створити екземпляр об’єкта карти за допомогою будь-якого з цих класів.

Наприклад:

Map hm = new HashMap ();  Map tm = new TreeMap ();   Where T is the type of the object.>

Часто використовуваною реалізацією інтерфейсу Map є HashMap.

HashMap

HashMap забезпечує базову реалізацію інтерфейсу Map Java. Він зберігає дані в парах (ключ, значення). Щоб отримати доступ до значення в HashMap, ми повинні знати його ключ. HashMap використовує техніку під назвою Хешування. Хешування — це техніка перетворення великого рядка в маленький рядок, який представляє той самий рядок, щоб операції індексування та пошуку відбувалися швидше. HashSet також використовує HashMap внутрішньо.

Давайте розберемося з HashMap на прикладі:

Java




// Java program to demonstrate the> // working of a HashMap> import> java.util.*;> public> class> HashMapDemo {> >// Main Method> >public> static> void> main(String args[])> >{> >// Creating HashMap and> >// adding elements> >HashMap hm> >=>new> HashMap();> >hm.put(>1>,>'Geeks'>);> >hm.put(>2>,>'For'>);> >hm.put(>3>,>'Geeks'>);> >// Finding the value for a key> >System.out.println(>'Value for 1 is '> + hm.get(>1>));> >// Traversing through the HashMap> >for> (Map.Entry e : hm.entrySet())> >System.out.println(e.getKey() +>' '> >+ e.getValue());> >}> }>

>

>

Вихід

Value for 1 is Geeks 1 Geeks 2 For 3 Geeks>