Rozhraní Queue je přítomno v java.util balíček a prodlužuje Rozhraní sběru se používá k uchování prvků, které mají být zpracovány, v pořadí FIFO (First In First Out). Jedná se o uspořádaný seznam objektů, jehož použití je omezeno na vkládání prvků na konec seznamu a mazání prvků ze začátku seznamu (tj. FIFO nebo princip First-In-First-Out.

Protože se jedná o rozhraní, fronta potřebuje konkrétní třídu pro deklaraci a nejběžnější třídy jsou PriorityQueue a Spojový seznam v Javě. Všimněte si, že žádná z těchto implementací není bezpečná pro vlákna. PriorityBlockingQueue je jednou z alternativních implementací, pokud je potřeba implementace bezpečná pro vlákna.
Prohlášení: Rozhraní fronty je deklarováno jako:
public interface Queue extends Collection>
Vytváření objektů fronty: Od té doby Fronta je rozhraní , nelze vytvořit objekty typu fronta. K vytvoření objektu vždy potřebujeme třídu, která tento seznam rozšiřuje. A také po zavedení Generika v Javě 1.5 je možné omezit typ objektu, který lze uložit do fronty. Tuto typově bezpečnou frontu lze definovat jako:
// Obj is the type of the object to be stored in Queue Queue queue = new PriorityQueue ();>
V Javě je rozhraní Queue podtypem rozhraní Collection a představuje kolekci prvků v určitém pořadí. Dodržuje princip první dovnitř, první ven (FIFO), což znamená, že prvky jsou načteny v pořadí, v jakém byly přidány do fronty.
Rozhraní fronty poskytuje několik metod pro přidávání, odebírání a kontrolu prvků ve frontě. Zde jsou některé z nejčastěji používaných metod:
add(element): Přidá prvek do zadní části fronty. Pokud je fronta plná, vyvolá výjimku.
offer(element): Přidá prvek do zadní části fronty. Pokud je fronta plná, vrátí hodnotu false.
remove(): Odebere a vrátí prvek na začátku fronty. Pokud je fronta prázdná, vyvolá výjimku.
poll(): Odebere a vrátí prvek na začátku fronty. Pokud je fronta prázdná, vrátí hodnotu null.
element(): Vrátí prvek na začátku fronty, aniž by jej odstranil. Pokud je fronta prázdná, vyvolá výjimku.
peek(): Vrátí prvek na začátek fronty, aniž by jej odstranil. Pokud je fronta prázdná, vrátí hodnotu null.
Rozhraní Queue je implementováno několika třídami v Javě, včetně LinkedList, ArrayDeque a PriorityQueue. Každá z těchto tříd poskytuje různé implementace rozhraní fronty s různými výkonnostními charakteristikami a funkcemi.
Celkově je rozhraní Queue užitečným nástrojem pro správu kolekcí prvků v určitém pořadí a je široce používáno v mnoha různých aplikacích a odvětvích.
Příklad:
Jáva
dijkstra
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);> >}> }> |
>
>Výstup
Queue: [apple, banana, cherry] Removed element: apple Queue after removal: [banana, cherry] Peeked element: banana Queue after peek: [banana, cherry, date]>
Příklad: Fronta
Jáva
// 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);> >}> }> |
>
>Výstup
Elements of queue [0, 1, 2, 3, 4] removed element-0 [1, 2, 3, 4] head of queue-1 Size of queue-4>
Operace na rozhraní fronty
Podívejme se, jak provést několik často používaných operací ve frontě pomocí Třída prioritní fronty .
1. Přidání prvků: Abychom mohli přidat prvek do fronty, můžeme použít metoda add(). . Objednávka vložení není zachována v PriorityQueue. Prvky jsou uloženy na základě pořadí priority, které je ve výchozím nastavení vzestupné.
Příklad
Jáva
linux přejmenovat složku
// 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);> >}> }> |
>
>Výstup
[For, Geeks, Geeks]>
2. Odebrání prvků: Abychom odstranili prvek z fronty, můžeme použít metoda remove(). Pokud existuje více takových objektů, pak se první výskyt objektu odstraní. Kromě toho se k odstranění hlavy a jejímu vrácení používá také metoda poll().
Příklad
Jáva
// 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);> >}> }> |
>
>Výstup
Initial Queue [For, Geeks, Geeks] After Remove [For, Geeks] Poll Method For Final Queue [Geeks]>
3. Iterace fronty: Existuje několik způsobů, jak procházet frontou. Nejznámějším způsobem je převod fronty na pole a procházení pomocí cyklu for. Fronta má však také vestavěný iterátor, který lze použít k iteraci frontou.
Příklad
Jáva
// 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() +>);> >}> >}> }> |
>
>Výstup
For Geeks Geeks>
Vlastnosti fronty: Následují charakteristiky fronty:
- Fronta se používá k vkládání prvků na konec fronty a odebírá se ze začátku fronty. Vychází z konceptu FIFO.
- Java Queue podporuje všechny metody rozhraní kolekce včetně vkládání, mazání atd.
- Spojový seznam , ArrayBlockingQueue a PriorityQueue jsou nejčastěji používané implementace.
- Pokud je na BlockingQueues provedena jakákoli operace null, je vyvolána výjimka NullPointerException.
- Fronty, které jsou dostupné v balíčku java.util, jsou neomezené fronty.
- Fronty, které jsou dostupné v balíčku java.util.concurrent, jsou ohraničené fronty.
- Všechny fronty kromě Deques podporují vkládání a odebírání na konci a na konci fronty. Vkládání a vyjímání nosného prvku Deques na obou koncích.
Třídy, které implementují rozhraní fronty:
1. PriorityQueue: Třída PriorityQueue, která je implementována v rámci kolekce, nám poskytuje způsob, jak zpracovat objekty na základě priority. Je známo, že fronta se řídí algoritmem First-In-First-Out, ale někdy je potřeba zpracovat prvky fronty podle priority, tehdy přichází do hry PriorityQueue. Podívejme se, jak pomocí této třídy vytvořit objekt fronty.
Příklad
Jáva
java system.out.println
// 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());> >}> }> |
>
>Výstup
10 10 15>
2. Spojový seznam: LinkedList je třída, která je implementována v rámci kolekce, která neodmyslitelně implementuje Příklad
Jáva
// 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());> >}> }> |
>
>Výstup
10 10 20>
3. PriorityBlockingQueue: Je třeba poznamenat, že obě implementace, PriorityQueue a LinkedList, nejsou bezpečné pro vlákna. PriorityBlockingQueue je jednou z alternativních implementací, pokud je potřeba implementace bezpečná pro vlákna. PriorityBlockingQueue je neomezená blokovací fronta, která používá stejná pravidla řazení jako třída PriorityQueue a zásoby blokující operace získávání.
Vzhledem k tomu, že je neomezený, přidání prvků může někdy selhat kvůli vyčerpání zdrojů, což má za následek OutOfMemoryError . Podívejme se, jak pomocí této třídy vytvořit objekt fronty.
Příklad
Jáva
// 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());> >}> }> |
>
>Výstup
10 10 15>
Metody rozhraní fronty
Rozhraní fronty dědí všechny metody přítomné v rozhraní sbírek při implementaci následujících metod:
| Metoda | Popis |
|---|---|
| add(int index, prvek) | Tato metoda se používá k přidání prvku do určitého indexu ve frontě. Když je předán jeden parametr, jednoduše přidá prvek na konec fronty. |
| addAll(int index, kolekce kolekce) | Tato metoda se používá k přidání všech prvků v dané kolekci do fronty. Když je předán jeden parametr, přidá všechny prvky dané kolekce na konec fronty. |
| velikost() | Tato metoda se používá k vrácení velikosti fronty. |
| Průhledná() | Tato metoda se používá k odstranění všech prvků ve frontě. Odkaz na vytvořenou frontu je však stále uložen. |
| odstranit() | Tato metoda se používá k odstranění prvku z přední části fronty. |
| odstranit (int index) | Tato metoda odebere prvek ze zadaného indexu. Následující prvky (pokud existují) posune doleva a sníží jejich indexy o 1. |
| odstranit (prvek) | Tato metoda se používá k odstranění a vrácení prvního výskytu daného prvku ve frontě. |
| get(int index) | Tato metoda vrací prvky na zadaném indexu. |
| set(int index, prvek) | Tato metoda nahradí prvky na daném indexu novým prvkem. Tato funkce vrací prvek, který byl právě nahrazen novým prvkem. |
| indexOf(prvek) | Tato metoda vrací první výskyt daného prvku resp -1 pokud prvek není přítomen ve frontě. |
| lastIndexOf(prvek) | Tato metoda vrací poslední výskyt daného prvku resp -1 pokud prvek není přítomen ve frontě. |
| rovná se (prvek) | Tato metoda slouží k porovnání rovnosti daného prvku s prvky fronty. |
| hashCode() | Tato metoda se používá k vrácení hodnoty hashcode dané fronty. |
| je prázdný() | Tato metoda se používá ke kontrole, zda je fronta prázdná nebo ne. Vrací hodnotu true, pokud je fronta prázdná, v opačném případě vrací hodnotu false. |
| obsahuje (prvek) | Tato metoda se používá ke kontrole, zda fronta obsahuje daný prvek či nikoliv. Pokud fronta obsahuje prvek, vrátí hodnotu true. |
| obsahuje vše (kolekce kolekce) | Tato metoda se používá ke kontrole, zda fronta obsahuje celou kolekci prvků. |
| řazení (komparátor) | Tato metoda se používá k řazení prvků fronty na základě daného srovnávač . |
| booleovské přidání (objekt) | Tato metoda se používá k vložení zadaného prvku do fronty a po úspěchu vrátí hodnotu true. |
| booleovská nabídka (objekt) | Tato metoda se používá k vložení zadaného prvku do fronty. |
| Object poll() | Tato metoda se používá k načtení a odstranění hlavy fronty nebo vrátí hodnotu null, pokud je fronta prázdná. |
| Object element() | Tato metoda se používá k načtení, ale neodstraní hlavu fronty. |
| Pohled na objekt () | Tato metoda se používá k načtení, ale neodstraní hlavičku této fronty, nebo vrátí hodnotu null, pokud je tato fronta prázdná. |
Výhody použití rozhraní Queue v Javě:
Uchování objednávky : Rozhraní Queue poskytuje způsob, jak ukládat a načítat prvky v určitém pořadí podle principu FIFO (first-in, first-out).
Flexibilita : Rozhraní Queue je podtypem rozhraní Collection, což znamená, že jej lze použít s mnoha různými datovými strukturami a algoritmy v závislosti na požadavcích aplikace.
Vlákno – bezpečnost : Některé implementace rozhraní Queue, jako je třída java.util.concurrent.ConcurrentLinkedQueue, jsou bezpečné pro vlákna, což znamená, že k nim může přistupovat více vláken současně, aniž by docházelo ke konfliktům.
Výkon : Rozhraní Queue poskytuje efektivní implementace pro přidávání, odebírání a kontrolu prvků, což z něj činí užitečný nástroj pro správu kolekcí prvků v aplikacích kritických pro výkon.
Verilog vždy
Nevýhody použití rozhraní Queue v Javě:
Omezená funkčnost: Rozhraní Queue je navrženo speciálně pro správu kolekcí prvků v určitém pořadí, což znamená, že nemusí být vhodné pro složitější datové struktury nebo algoritmy.
Omezení velikosti: Některé implementace rozhraní Queue, jako je třída ArrayDeque, mají pevnou velikost, což znamená, že nemohou přesáhnout určitý počet prvků.
Využití paměti: V závislosti na implementaci může rozhraní Queue vyžadovat více paměti než jiné datové struktury, zejména pokud potřebuje uložit další informace o pořadí prvků.
Složitost : Pro začínající programátory může být obtížné používat a pochopit rozhraní Queue, zvláště pokud nejsou obeznámeni s principy datových struktur a algoritmů.