Dla wielu osób słowo „kolejka” budzi bardzo mało przyjemnych skojarzeń. Ale dzisiaj mówimy o innych kolejkach - w Javie. Kolejka w Javie to wszystko, co dziedziczy interfejs kolejki , który z kolei rozszerza kolekcję . Oznacza to, że kolejki można traktować jak kolekcje.

Kolejki w Javie działają na dwóch zasadach: FIFO i LIFO .

FIFO – First In First Out, zasada normalnej kolejki (oczywiście jeśli nie ma takich, którzy muszą „po prostu zapytać”), w której pierwszy element wchodzi do kolejki i jako pierwszy z niej wychodzi.

LIFO - Last In First Out, zasada stosu, w której ostatni element dodany do kolejki jako pierwszy ją opuści. Na przykład, jak z talią kart: będziesz brał wszystkie karty z wierzchu na raz, aby dotrzeć do końca.

Hierarchia kolejek w Javie wygląda następująco:

Tutaj możesz zobaczyć, że Queue ma 3 klasy implementacji: LinkedList , ArrayDeque i PriorityQueue . LinkedList i ArrayDeque dziedziczą bezpośrednio nie z Queue , ale z Deque .

Deque to interfejs dodany w wersji 6 Javy. Zawiera szereg przydatnych metod dla kolejek i umożliwia działanie kolejki jako kolejki dwukierunkowej. Czyli praca na zasadzieFIFOlubLIFO.

Jednym z dwóch potomków Deque jest ArrayDeque . Obsługuje dwukierunkową strukturę danych kolejki, umożliwiając wstawianie i usuwanie elementów z obu stron. Jest to również tablica dynamiczna, której rozmiar może automatycznie rosnąć.

Istnieje również klasa PriorityQueue , która jest bezpośrednim potomkiem Queue : działa inaczej niż potomkowie Dequeue .

PriorityQueue to kolejka priorytetowa, która domyślnie układa elementy zgodnie z naturalnym porządkiem sortowania. Do sortowania używane są tu Porównywalne i Porównywalne . Zasada jest tutaj taka sama jak w przypadku TreeSet lub TreeMap — klasy, które są zgodne z interfejsem Comparable i mają własny porządek sortowania.


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());
}

Uruchomienie tego przykładu w konsoli da ci:

Rob
Jan
Andrzej

Ponieważ pracujemy z kolejkami, a nie zwykłymi kolekcjami, musimy usunąć element z listy. Użyjmy tej konstrukcji:


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

Interfejs Deque dziedziczy metody Queue i dodaje kilka własnych, interesujących metod:

void addFirst(E obj) Dodaje element obj na początek kolejki
void addLast(E obj) Dodaje element obj na koniec kolejki
E getFirst() Zwraca pierwszy element z kolejki
E getLast() Zwraca ostatni element z kolejki
boolean OfferFirst(E obj) Dodaje element obj na początek kolejki i zwraca wartość true , jeśli element został dodany, w przeciwnym razie zwraca wartość false
boolean OfferLast(E obj) Dodaje element obj na koniec kolejki i zwraca wartość true , jeśli element został dodany, w przeciwnym razie zwraca wartość false
E pop() Wyciąga pierwszy element z kolejki i usuwa go
void push(E obiekt) Dodaje element obj na początek kolejki
Najpierw zerknij() Zwraca (ale nie usuwa) pierwszy element z kolejki
E peekLast() Zwraca (ale nie usuwa) ostatni element z kolejki
Pierwsza ankieta() Zwraca i usuwa pierwszy element z kolejki, zwróci null , jeśli nie ma żadnych elementów
E ankietaOstatnia() Zwraca i usuwa ostatni element z kolejki, zwróci null , jeśli nie ma żadnych elementów
E usuńOstatni() Zwraca i usuwa pierwszy element kolejki, zgłasza wyjątek w przypadku braku elementów
E usuńPierwszy() Zwraca i usuwa ostatni element kolejki, zgłasza wyjątek w przypadku braku elementów
boolean removeFirstOccurrence(obiekt obiektu) Usuwa pierwsze wystąpienie obj z kolejki
boolean removeLastOccurrence(obiekt obiektu) Usuwa ostatnie wystąpienie obj z kolejki

Przyjrzyjmy się teraz kilku z nich w praktyce.

Najpierw dodajmy element do kolejki:


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);
    
[Pomarańczowy, Jabłkowy, Ananasowy]

Teraz otrzymujemy wartości z kolejki:


	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());
                          
    }
    

Ten kod wyświetli pierwszy i ostatni element kolejki w konsoli.

Pierwszy element to: Pomarańcza
Ostatni element to: 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);
    

Uruchamiając ten kod, otrzymujemy:

Pomarańczowe
Jabłko

[Ananas, Cytryna]

Różnica między metodami pop() i poll() polega na tym, że pop() zgłosi wyjątek NoSuchElementException na pustej liście, podczas gdy poll() zwróci wartość null .

Przyjrzyjmy się teraz metodom pollFirst() i 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);
    

Cytryna Pomarańczowa
[Jabłko, Ananas]

Obie metody zwracają i usuwają wartość z kolejki.

Przykład użycia metod peekFirst() i 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);
    
Pierwszy element to: John
Ostatni element to: Oliver
[John, Rob, Greg, Max, Oliver]

Obie metody zwracają pierwszy/ostatni element z kolejki i nie usuwają ich. W przypadku, gdy kolejka jest pusta, zwrócona zostanie wartość null .

Ogólnie coś w tym stylu, dzisiaj nauczyliśmy się pracować z kolejkami w Javie. Teraz będziesz wiedział, jak je wykorzystać w praktyce.