Kontynuacja tematu kolekcji 😊 Tak ja powiedziałem w pierwszym wpisie z serii, temat kolekcji jest dość złożony. Dziś omówimy kolejki. Muszę przyznać że przez ponad 7 lat aktywnego programowania czystych Javowych kolejek nie używałem zbyt często 😉 Jednak nie zmienia to faktu że kolejki w określonych sytuacjach mogą być naprawdę bardzo przydatne!
01. Kolejki
Kolejki zachowują się mniej więcej jak kolejki w sklepie. Ktoś podchodzi do kasy, zanim ustawiają się kolejne osoby, pierwsza osoba zostaje obsłużona, odchodzi o kasy, kolejna osoba jest z przodu, gotowa aby ją obsłużyć. Większość kolejek w Javie jest typu FIFO – first in first out, dokładnie takich jak w sklepie.
Odstępem od kolejek typu FIFO jest PriorityQueue o której wspomniałem w pierwszym wpisie odnośnie kolekcji. Kolejka ta zachowuje się podobnie do TreeSetu, sortuje elementy według comperatora.
ArrayDeque jest specyficzną implementacją kolejki która pozwala na obsługę elementów z początku jak i końca kolejki.
Ciekawostką jest to że LinkedList jest jednocześnie Listą oraz Kolejką 😊 (Spójrz na rysunek w pierwszym wpisie o kolekcjach), zatem całkowicie poprawnym sposobem na utworzenie kolejki jest taki zapis:
Queue<String> stringQueue = new LinkedList<>();
02. Podstawowe operacje
Podstawowe operacja dla kolejek add, offer, remove, poll, element oraz peek. Wszystkie te metody są zadeklarowane w interfejsie Queue. Jednak tylko trzy z tych metod są najczęściej wykorzystywane, są to:
offer – dodaje element do kolejki, jest to preferowana metoda dodawania elementu do kolejki, metoda add w niektórych implementacjach podczas nieudanego dodania rzuca wyjątkiem, co może zaskoczyć 😉 Gdy pracujemy z kolejkami i chcemy dodać do niej element, stosujmy offer.
poll – pobiera oraz zdejmuje element z początku kolejki.
peek – pobiera element z kolejki bez zdejmowania go.
Należy pamiętać że kolejki należą do kolekcji! Możemy zatem sprawdzić ile elementów znajduje się w kolejce wywołując metodę size, czy przejść przez wszystkie elementy z wykorzystaniem pętli.
Queue<String> stringQueue = new LinkedList<>(); stringQueue.offer("Arek"); stringQueue.offer("Karol"); stringQueue.offer("Robert"); stringQueue.offer("Szymon"); System.out.println(stringQueue.size()); System.out.println(stringQueue.poll()); System.out.println(stringQueue.size()); System.out.println("--------"); for (String hero : stringQueue) { System.out.println(hero); }
Podsumowanie
Kolejki są naprawdę specyficznym rodzajem kolekcji, jest to bardzo przydatna struktura w określonych sytuacjach. Dobrze mieć świadomość tego jak działa i jakie możliwości oferuje. Nigdy nie wiadomo kiedy przyjdzie czas w którym może uratować sytuację 😊