For de fleste bringer ordet «kø» tankene på svært få hyggelige assosiasjoner. Men i dag snakker vi om forskjellige køer - Java-køer. I Java er en kø alt som arver Queue- grensesnittet, som igjen utvider Collection- grensesnittet. Det betyr at køer kan behandles som samlinger.

Køer i Java støtter to driftsprinsipper: FIFO og LIFO .

FIFO - prinsippet (First In, First Out) styrer en vanlig kø – det første elementet som legges til køen er det første som forlater den.

LIFO - prinsippet (Last In, First Out) beskriver oppførselen til en stabel – det siste elementet som legges til i køen er det første som forlater den. For eksempel, dette er hvordan du jobber med en kortstokk: du tar kortene av toppen ett om gangen til du når bunnen av bunken.

Køhierarkiet i Java ser slik ut:

Her kan du se at Queue har 3 implementeringsklasser: LinkedList , ArrayDeque og PriorityQueue . LinkedList og ArrayDeque arver ikke Queue direkte , men Deque .

Deque er et grensesnitt som ble lagt til i Java 6. Det inkluderer flere metoder som er nyttige for køer og lar en kø fungere som en tosidig (eller toveis) kø. Det betyr at det kan væreFIFOogLIFO.

En av Deque- grensesnittets to etterkommere er ArrayDeque . Den støtter en dobbel-ended kø som lar deg sette inn og fjerne elementer fra begge ender. Det er også en dynamisk array som automatisk vokser i størrelse.

Det er også en PriorityQueue- klasse, som er en direkte etterkommer av Queue : den oppfører seg annerledes enn klassene som implementerer Deque .

PriorityQueue er en prioritert kø som organiserer elementer i henhold til deres naturlige rekkefølge som standard. Her bruker sorteringen grensesnittene Comparable og Comparator . Prinsippet er det samme som med TreeSet eller TreeMap - klasser som bruker Comparable- grensesnittet og har sin egen sorteringsrekkefølge.


PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));

priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");

while (!priorityQueue.isEmpty()) {
   System.out.println(priorityQueue.remove());
}

Hvis du kjører dette eksemplet, ser du dette i konsollen:

Rob
John
Andrew

Siden vi jobber med køer og ikke vanlige samlinger, må vi fjerne elementene fra listen. For å gjøre dette bruker vi denne konstruksjonen:


while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

Deque - grensesnittet arver Queue- metodene og legger til flere av sine egne interessante metoder:

void addFirst(E obj) Legger til obj- elementet foran i køen
void addLast(E obj) Legger til obj- elementet på slutten av køen
E getFirst() Returnerer det første elementet fra køen
E getLast() Returnerer det siste elementet fra køen
boolsk tilbud først(E obj) Legger til obj- elementet foran i køen, og returnerer true hvis elementet legges til. Ellers returnerer false .
boolsk tilbudSiste(E obj) Legger til obj- elementet på slutten av køen, og returnerer true hvis elementet legges til. Ellers returnerer false .
E pop() Henter det første elementet fra køen og fjerner det
void push(E obj) Legger til obj- elementet foran i køen
E peekFirst() Returnerer (men fjerner ikke) det første elementet fra køen
E peekLast() Returnerer (men fjerner ikke) det siste elementet fra køen
E pollFirst() Returnerer og fjerner det første elementet fra køen. Returnerer null hvis det ikke er noen elementer.
E pollLast() Returnerer og fjerner det siste elementet fra køen. Returnerer null hvis det ikke er noen elementer.
E removeLast() Returnerer og fjerner det første elementet i køen. Kaster et unntak hvis det ikke er noen elementer.
E removeFirst() Returnerer og fjerner det siste elementet i køen. Kaster et unntak hvis det ikke er noen elementer.
boolesk removeFirstOccurrence(Object obj) Fjerner den første forekomsten av obj fra køen
boolesk removeLastOccurrence(Object obj) Fjerner den siste forekomsten av obj fra køen

La oss nå se på noen av disse metodene i praksis.

Først, la oss legge til et element i en kø:


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Adds "Apple" to the end of the queue
        deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
        deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
  
        System.out.println(deque);
    
[Oransje, eple, ananas]

La oss nå få verdier fra en kø:


	Deque<String> deque = new ArrayDeque<>();

	deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 

         
        System.out.println("The first element is: "+ deque.getFirst());
                          
        System.out.println("The last element is: " + deque.getLast());
                          
    }
    

Denne koden viser det første og siste elementet i køen.

Det første elementet er: Orange
Det siste elementet er: Ananas


         Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue

System.out.println(deque);
    

Ved å kjøre denne koden får vi:

Appelsin
eple

[ananas, sitron]

Forskjellen mellom pop() og poll() er at pop() vil kaste et NoSuchElementException hvis listen er tom liste, men poll() vil returnere null .

Nå skal vi vurdere metodene pollFirst() og pollLast() .


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
    
Appelsin
sitron
[eple, ananas]

Begge metodene returnerer og fjerner en verdi fra køen.

Her er et eksempel på bruk av metodene peekFirst() og peekLast() :


Deque<String> friends = new ArrayDeque<>();

friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");

System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());

System.out.println(friends);
    
Det første elementet er: John
Det siste elementet er: Oliver
[John, Rob, Greg, Max, Oliver]

Begge metodene returnerer det første/siste elementet fra køen og fjerner dem ikke. Hvis køen er tom, vil null bli returnert.

Bra gjort! I dag lærte vi å jobbe med køer i Java. Nå vet du hvordan du bruker dem i praksis.