For de fleste leder ordet "kø" hen til meget få hyggelige associationer. Men i dag taler vi om forskellige køer - Java-køer. I Java er en kø alt, der arver Queue- grænsefladen, hvilket igen udvider Collection- grænsefladen. Det betyder, at køer kan behandles som samlinger.

Køer i Java understøtter to driftsprincipper: FIFO og LIFO .

FIFO - princippet (First In, First Out) styrer en almindelig kø - det første element, der tilføjes til køen, er det første, der forlader den.

LIFO - princippet (Last In, First Out) beskriver opførselen af ​​en stak - det sidste element, der tilføjes til køen, er det første, der forlader den. For eksempel er det sådan, du arbejder med et sæt kort: Du tager kortene fra toppen et ad gangen, indtil du når bunden af ​​bunken.

Køhierarkiet i Java ser sådan ud:

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

Deque er en grænseflade, der blev tilføjet i Java 6. Den indeholder flere metoder, der er nyttige til køer og tillader en kø at fungere som en dobbeltendet (eller tovejs) kø. Det betyder, at det kan væreFIFOogLIFO.

En af Deque- grænsefladens to efterkommere er ArrayDeque . Den understøtter en kø med dobbelt ende, der lader dig indsætte og fjerne elementer fra begge ender. Det er også et dynamisk array, der automatisk vokser i størrelse.

Der er også en PriorityQueue- klasse, som er en direkte efterkommer af Queue : den opfører sig anderledes end de klasser, der implementerer Deque .

PriorityQueue er en prioritetskø, der som standard organiserer elementer i overensstemmelse med deres naturlige rækkefølge. Her bruger sorteringen interfaces Comparable og Comparator . Princippet er det samme som med TreeSet eller TreeMap — klasser, der bruger den sammenlignelige grænseflade og har deres egen sorteringsrækkefø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 kører dette eksempel, vil du se her i konsollen:

Rob
John
Andrew

Da vi arbejder med køer og ikke almindelige samlinger, skal vi fjerne elementerne fra listen. For at gøre dette bruger vi denne konstruktion:


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

Deque - grænsefladen arver Queue- metoderne og tilføjer flere af sine egne interessante metoder:

void addFirst(E obj) Tilføjer obj - elementet foran i køen
void addLast(E obj) Tilføjer obj - elementet til slutningen af ​​køen
E getFirst() Returnerer det første element fra køen
E getLast() Returnerer det sidste element fra køen
boolesk tilbud først(E obj) Tilføjer obj- elementet foran i køen og returnerer sandt , hvis elementet tilføjes. Ellers returnerer falsk .
boolesk tilbud Sidste(E obj) Tilføjer obj- elementet til slutningen af ​​køen og returnerer sandt , hvis elementet tilføjes. Ellers returnerer falsk .
E pop() Henter det første element fra køen og fjerner det
void push(E obj) Tilføjer obj - elementet foran i køen
E peekFirst() Returnerer (men fjerner ikke) det første element fra køen
E peekLast() Returnerer (men fjerner ikke) det sidste element fra køen
E pollFirst() Returnerer og fjerner det første element fra køen. Returnerer null , hvis der ikke er nogen elementer.
E pollLast() Returnerer og fjerner det sidste element fra køen. Returnerer null , hvis der ikke er nogen elementer.
E removeLast() Returnerer og fjerner det første element i køen. Kaster en undtagelse, hvis der ikke er nogen elementer.
E removeFirst() Returnerer og fjerner det sidste element i køen. Kaster en undtagelse, hvis der ikke er nogen elementer.
boolean removeFirstOccurrence(Object obj) Fjerner den første forekomst af obj fra køen
boolean removeLastOccurrence(Object obj) Fjerner den sidste forekomst af obj fra køen

Lad os nu se på et par af disse metoder i praksis.

Lad os først tilføje et element til 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);
    
[Orange, æble, ananas]

Lad os nu få værdier 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 kode viser det første og sidste element i køen.

Det første element er: Orange
Det sidste element 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 at køre denne kode får vi:

Appelsinæble [Ananas, Citron
]

Forskellen mellem pop() og poll() er, at pop() vil kaste et NoSuchElementException , hvis listen er tom, men poll() vil returnere null .

Nu vil vi overveje metoderne 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);
    
Orange
citron
[æble, ananas]

Begge metoder returnerer og fjerner en værdi fra køen.

Her er et eksempel på brug af metoderne 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 element er: John
Det sidste element er: Oliver
[John, Rob, Greg, Max, Oliver]

Begge metoder returnerer det første/sidste element fra køen og fjerner dem ikke. Hvis køen er tom, returneres null .

Godt klaret! I dag lærte vi at arbejde med køer i Java. Nu ved du, hvordan du bruger dem i praksis.