Інтерфейс Queue присутній у java.util пакет і розширює Інтерфейс колекції використовується для зберігання елементів, які збираються обробити, у порядку FIFO (першим прийшов, першим вийшов). Це впорядкований список об’єктів, використання якого обмежується вставкою елементів у кінець списку та видаленням елементів із початку списку (тобто, він слідує за FIFO або принцип «перший прийшов – перший вийшов».

Будучи інтерфейсом, черга потребує конкретного класу для оголошення, і найпоширенішими класами є PriorityQueue і LinkedList на Java. Зауважте, що жодна з цих реалізацій не є потокобезпечною. PriorityBlockingQueue є однією з альтернативних реалізацій, якщо потрібна потокобезпечна реалізація.
Декларація: Інтерфейс черги оголошено так:
public interface Queue extends Collection>
Створення об'єктів черги: Оскільки Черга є інтерфейс , не можна створювати об’єкти типу черги. Нам завжди потрібен клас, який розширює цей список, щоб створити об’єкт. А також, після введення Дженерики у Java 1.5 можна обмежити тип об’єкта, який можна зберігати в черзі. Цю типобезпечну чергу можна визначити як:
// Obj is the type of the object to be stored in Queue Queue queue = new PriorityQueue ();>
У Java інтерфейс Queue є підтипом інтерфейсу Collection і представляє набір елементів у певному порядку. Він дотримується принципу FIFO (першим увійшов, першим вийшов), що означає, що елементи витягуються в тому порядку, в якому вони були додані до черги.
Інтерфейс Queue надає кілька методів для додавання, видалення та перевірки елементів у черзі. Ось деякі з найбільш часто використовуваних методів:
add(element): додає елемент у кінець черги. Якщо черга заповнена, створюється виняток.
offer(element): додає елемент у кінець черги. Якщо черга заповнена, повертається false.
remove(): видаляє та повертає елемент на початку черги. Якщо черга порожня, виникає виняток.
назва спеціальних символів
poll(): видаляє та повертає елемент на початку черги. Якщо черга порожня, вона повертає значення null.
element(): повертає елемент на початку черги, не видаляючи його. Якщо черга порожня, виникає виняток.
peek(): повертає елемент на початку черги, не видаляючи його. Якщо черга порожня, вона повертає значення null.
Інтерфейс Queue реалізований кількома класами в Java, включаючи LinkedList, ArrayDeque і PriorityQueue. Кожен із цих класів забезпечує різні реалізації інтерфейсу черги з різними характеристиками та функціями продуктивності.
Загалом, інтерфейс Queue є корисним інструментом для керування колекціями елементів у певному порядку та широко використовується в багатьох різних програмах і галузях.
приклад:
Java
import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> >public> static> void> main(String[] args) {> >Queue queue =>new> LinkedList();> >// add elements to the queue> >queue.add(>'apple'>);> >queue.add(>'banana'>);> >queue.add(>'cherry'>);> >// print the queue> >System.out.println(>'Queue: '> + queue);> >// remove the element at the front of the queue> >String front = queue.remove();> >System.out.println(>'Removed element: '> + front);> >// print the updated queue> >System.out.println(>'Queue after removal: '> + queue);> >// add another element to the queue> >queue.add(>'date'>);> >// peek at the element at the front of the queue> >String peeked = queue.peek();> >System.out.println(>'Peeked element: '> + peeked);> >// print the updated queue> >System.out.println(>'Queue after peek: '> + queue);> >}> }> |
>
>Вихід
зображення як фон в css
Queue: [apple, banana, cherry] Removed element: apple Queue after removal: [banana, cherry] Peeked element: banana Queue after peek: [banana, cherry, date]>
приклад: Черга
Java
// Java program to demonstrate a Queue> import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> >public> static> void> main(String[] args)> >{> >Queue q> >=>new> LinkedList();> >// Adds elements {0, 1, 2, 3, 4} to> >// the queue> >for> (>int> i =>0>; i <>5>; i++)> >q.add(i);> >// Display contents of the queue.> >System.out.println(>'Elements of queue '> >+ q);> >// To remove the head of queue.> >int> removedele = q.remove();> >System.out.println(>'removed element-'> >+ removedele);> >System.out.println(q);> >// To view the head of queue> >int> head = q.peek();> >System.out.println(>'head of queue-'> >+ head);> >// Rest all methods of collection> >// interface like size and contains> >// can be used with this> >// implementation.> >int> size = q.size();> >System.out.println(>'Size of queue-'> >+ size);> >}> }> |
>
>Вихід
Elements of queue [0, 1, 2, 3, 4] removed element-0 [1, 2, 3, 4] head of queue-1 Size of queue-4>
Операції в інтерфейсі черги
Давайте подивимося, як виконати кілька часто використовуваних операцій над чергою за допомогою Пріоритетний клас черги .
1. Додавання елементів: Щоб додати елемент у чергу, ми можемо використати метод add(). . Порядок вставки не зберігається в PriorityQueue. Елементи зберігаються на основі порядку пріоритету, який за замовчуванням є зростаючим.
приклад
Java
// Java program to add elements> // to a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >System.out.println(pq);> >}> }> |
>
>Вихід
[For, Geeks, Geeks]>
2. Видалення елементів: Щоб видалити елемент із черги, ми можемо використати метод remove(). Якщо таких об’єктів декілька, видаляється перший випадок об’єкта. Крім того, метод poll() також використовується для видалення голови та її повернення.
приклад
Java
// Java program to remove elements> // from a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >System.out.println(>'Initial Queue '> + pq);> >pq.remove(>'Geeks'>);> >System.out.println(>'After Remove '> + pq);> >System.out.println(>'Poll Method '> + pq.poll());> >System.out.println(>'Final Queue '> + pq);> >}> }> |
c# містить рядок
>
>Вихід
Initial Queue [For, Geeks, Geeks] After Remove [For, Geeks] Poll Method For Final Queue [Geeks]>
3. Ітерація черги: Існує кілька способів проходження черги. Найвідомішим способом є перетворення черги в масив і проходження за допомогою циклу for. Однак черга також має вбудований ітератор, який можна використовувати для проходження черги.
приклад
Java
// Java program to iterate elements> // to a Queue> import> java.util.*;> public> class> GFG {> >public> static> void> main(String args[])> >{> >Queue pq =>new> PriorityQueue();> >pq.add(>'Geeks'>);> >pq.add(>'For'>);> >pq.add(>'Geeks'>);> >Iterator iterator = pq.iterator();> >while> (iterator.hasNext()) {> >System.out.print(iterator.next() +>' '>);> >}> >}> }> |
>
>Вихід
For Geeks Geeks>
Характеристики черги: Наступні характеристики черги:
- Черга використовується для вставки елементів у кінець черги та видалення з початку черги. Він відповідає концепції FIFO.
- Черга Java підтримує всі методи інтерфейсу колекції, включаючи вставку, видалення тощо.
- LinkedList , ArrayBlockingQueue і PriorityQueue є найбільш часто використовуваними реалізаціями.
- Якщо над BlockingQueues виконується будь-яка нульова операція, виникає виняткова ситуація NullPointerException.
- Черги, доступні в пакеті java.util, є необмеженими чергами.
- Черги, доступні в пакеті java.util.concurrent, є обмеженими чергами.
- Усі черги, крім Deques, підтримують вставлення та видалення в хвості та голові черги відповідно. Deques підтримують вставлення та видалення елементів з обох кінців.
Класи, які реалізують інтерфейс черги:
1. PriorityQueue: Клас PriorityQueue, реалізований у рамках колекції, надає нам спосіб обробки об’єктів на основі пріоритету. Відомо, що черга працює за алгоритмом First-In-First-Out, але іноді елементи черги потрібно обробляти відповідно до пріоритету, тоді в гру вступає PriorityQueue. Давайте подивимося, як створити об’єкт черги за допомогою цього класу.
приклад
Java
// Java program to demonstrate the> // creation of queue object using the> // PriorityQueue class> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty priority queue> >Queue pQueue> >=>new> PriorityQueue();> >// Adding items to the pQueue> >// using add()> >pQueue.add(>10>);> >pQueue.add(>20>);> >pQueue.add(>15>);> >// Printing the top element of> >// the 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>
2. Зв'язаний список: LinkedList — це клас, реалізований у рамках колекції, яка за своєю суттю реалізує приклад
Java
// Java program to demonstrate the> // creation of queue object using the> // LinkedList class> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty LinkedList> >Queue ll> >=>new> LinkedList();> >// Adding items to the ll> >// using add()> >ll.add(>10>);> >ll.add(>20>);> >ll.add(>15>);> >// Printing the top element of> >// the LinkedList> >System.out.println(ll.peek());> >// Printing the top element and removing it> >// from the LinkedList container> >System.out.println(ll.poll());> >// Printing the top element again> >System.out.println(ll.peek());> >}> }> |
весняний черевик
>
nfa до dfa
>Вихід
10 10 20>
3. PriorityBlockingQueue: Слід зазначити, що обидві реалізації, PriorityQueue і LinkedList, не є потокобезпечними. PriorityBlockingQueue є альтернативною реалізацією, якщо потрібна потокобезпечна реалізація. PriorityBlockingQueue — це необмежена черга блокування, яка використовує ті самі правила впорядкування, що й клас PriorityQueue і припаси блокують операції пошуку.
Оскільки він необмежений, додавання елементів іноді може не вдаватися через виснаження ресурсу, що призводить до OutOfMemoryError . Давайте подивимося, як створити об’єкт черги за допомогою цього класу.
приклад
Java
// Java program to demonstrate the> // creation of queue object using the> // PriorityBlockingQueue class> import> java.util.concurrent.PriorityBlockingQueue;> import> java.util.*;> class> GfG {> >public> static> void> main(String args[])> >{> >// Creating empty priority> >// blocking queue> >Queue pbq> >=>new> PriorityBlockingQueue();> >// Adding items to the pbq> >// using add()> >pbq.add(>10>);> >pbq.add(>20>);> >pbq.add(>15>);> >// Printing the top element of> >// the PriorityBlockingQueue> >System.out.println(pbq.peek());> >// Printing the top element and> >// removing it from the> >// PriorityBlockingQueue> >System.out.println(pbq.poll());> >// Printing the top element again> >System.out.println(pbq.peek());> >}> }> |
>
>Вихід
10 10 15>
Методи інтерфейсу черги
Інтерфейс черги успадковує всі методи, присутні в інтерфейс колекції при реалізації наступних методів:
| метод | опис |
|---|---|
| add(int індекс, елемент) | Цей метод використовується для додавання елемента за певним індексом у черзі. Коли передається один параметр, він просто додає елемент у кінець черги. |
| addAll(int index, Collection collection) | Цей метод використовується для додавання всіх елементів у даній колекції до черги. Коли передається один параметр, він додає всі елементи даної колекції в кінець черги. |
| розмір() | Цей метод використовується для повернення розміру черги. |
| очистити() | Цей метод використовується для видалення всіх елементів у черзі. Однак посилання на створену чергу все ще зберігається. |
| видалити() | Цей метод використовується для видалення елемента з початку черги. |
| видалити (індекс) | Цей метод видаляє елемент із зазначеного індексу. Він зсуває наступні елементи (якщо такі є) ліворуч і зменшує їхні індекси на 1. |
| видалити (елемент) | Цей метод використовується для видалення та повернення першого входження даного елемента в чергу. |
| отримати (індекс індексу) | Цей метод повертає елементи за вказаним індексом. |
| набір (індекс, елемент) | Цей метод замінює елементи з заданим індексом на новий елемент. Ця функція повертає елемент, який щойно був замінений новим елементом. |
| indexOf(елемент) | Цей метод повертає перше входження даного елемента або -1 якщо елемент відсутній у черзі. |
| lastIndexOf(елемент) | Цей метод повертає останнє входження заданого елемента або -1 якщо елемент відсутній у черзі. |
| дорівнює (елемент) | Цей метод використовується для порівняння рівності заданого елемента з елементами черги. |
| hashCode() | Цей метод використовується для повернення значення хеш-коду даної черги. |
| пусто() | Цей метод використовується для перевірки порожньої черги. Він повертає true, якщо черга порожня, інакше повертає false. |
| містить (елемент) | Цей метод використовується для перевірки, чи містить черга даний елемент чи ні. Він повертає true, якщо черга містить елемент. |
| міститьВсе (колекція колекції) | Цей метод використовується для перевірки, чи містить черга всю колекцію елементів. |
| sort (Comparator comp) | Цей метод використовується для сортування елементів черги на основі заданого компаратор . |
| логічне додавання (об'єкт) | Цей метод використовується, щоб вставити вказаний елемент у чергу та повернути true у разі успіху. |
| логічна пропозиція (об'єкт) | Цей метод використовується для вставки зазначеного елемента в чергу. |
| Опитування об'єктів() | Цей метод використовується для отримання та видалення голови черги або повертає значення null, якщо черга порожня. |
| Елемент об'єкта() | Цей метод використовується для отримання, але не видалення голови черги. |
| Об'єкт peek() | Цей метод використовується для отримання, але не видалення голови цієї черги, або повертає null, якщо ця черга порожня. |
Переваги використання інтерфейсу черги в Java:
Збереження порядку : Інтерфейс Queue забезпечує спосіб зберігання та отримання елементів у певному порядку, дотримуючись принципу «першим прийшов, першим вийшов» (FIFO).
Гнучкість : Інтерфейс Queue є підтипом інтерфейсу Collection, що означає, що його можна використовувати з багатьма різними структурами даних і алгоритмами, залежно від вимог програми.
Нитка – безпеки : Деякі реалізації інтерфейсу Queue, такі як клас java.util.concurrent.ConcurrentLinkedQueue, є потокобезпечними, що означає, що до них можна отримати доступ кількома потоками одночасно, не викликаючи конфліктів.
Продуктивність : інтерфейс Queue забезпечує ефективні реалізації для додавання, видалення та перевірки елементів, що робить його корисним інструментом для керування колекціями елементів у критично важливих для продуктивності програмах.
Недоліки використання інтерфейсу черги в Java:
Обмежена функціональність: Інтерфейс Queue розроблений спеціально для керування колекціями елементів у певному порядку, що означає, що він може не підходити для більш складних структур даних або алгоритмів.
Обмеження розміру: Деякі реалізації інтерфейсу Queue, такі як клас ArrayDeque, мають фіксований розмір, що означає, що вони не можуть перевищувати певну кількість елементів.
Використання пам'яті: Залежно від реалізації, інтерфейс Queue може вимагати більше пам’яті, ніж інші структури даних, особливо якщо йому потрібно зберігати додаткову інформацію про порядок елементів.
Складність : Інтерфейс Queue може бути складним для користування та розуміння програмістами-початківцями, особливо якщо вони не знайомі з принципами структур даних і алгоритмів.