Çoğu insan için "kuyruk" kelimesi akla çok az hoş çağrışım getirir. Ancak bugün farklı kuyruklardan bahsediyoruz — Java kuyrukları. Java'da sıra, Sıra arabirimini devralan ve dolayısıyla Toplama arabirimini genişleten herhangi bir şeydir. Bu, kuyrukların koleksiyonlar gibi ele alınabileceği anlamına gelir.

Java'daki kuyruklar iki çalışma ilkesini destekler: FIFO ve LIFO .

FIFO (First In, First Out) ilkesi normal bir kuyruğu yönetir — kuyruğa eklenen ilk öğe, ondan ilk ayrılan öğedir .

LIFO (Son Giren İlk Çıkar) ilkesi, bir yığının davranışını tanımlar — kuyruğa eklenen son öğe, ondan ilk ayrılan öğedir . Örneğin, bir iskambil destesiyle şu şekilde çalışırsınız: destenin en altına ulaşana kadar üstteki kartları teker teker alırsınız.

Java'daki Kuyruk hiyerarşisi şöyle görünür :

Burada Queue'nin 3 uygulama sınıfı olduğunu görebilirsiniz : LinkedList , ArrayDeque ve PriorityQueue . LinkedList ve ArrayDeque doğrudan Queue'yi değil , Deque'yi devralır .

Deque , Java 6'da eklenen bir arabirimdir. Kuyruklar için yararlı olan birkaç yöntem içerir ve bir kuyruğun çift uçlu (veya iki yönlü) bir sıra olarak işlev görmesini sağlar. Bu, FIFOveLIFOolabileceği anlamına gelir.

Deque arabiriminin iki soyundan biri ArrayDeque'dir . Her iki uçtan da öğe eklemenize ve kaldırmanıza izin veren çift uçlu bir kuyruğu destekler. Ayrıca otomatik olarak boyut olarak büyüyen dinamik bir dizidir.

Ayrıca, Queue'nun doğrudan soyundan gelen bir PriorityQueue sınıfı da vardır : Deque'yi uygulayan sınıflardan farklı davranır .

PriorityQueue , öğeleri varsayılan olarak doğal sıralamalarına göre düzenleyen bir öncelik sırasıdır. Burada sıralama Karşılaştırılabilir ve Karşılaştırıcı arayüzlerini kullanır. İlke, Comparable arabirimini kullananve kendi sıralama düzenine sahip olan TreeSet veya TreeMap sınıflarıyla aynıdır


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

Bu örneği çalıştırırsanız, konsolda şunları göreceksiniz:

Rob
John
Andrew

Normal koleksiyonlarla değil kuyruklarla çalıştığımız için, öğeleri listeden kaldırmamız gerekiyor. Bunu yapmak için şu yapıyı kullanıyoruz:


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

Deque arabirimi , Queue yöntemlerini devralır ve kendi ilginç yöntemlerinden birkaçını ekler:

geçersiz addFirst(Õ nesne) obj öğesini kuyruğun önüne ekler
geçersiz addLast(Е nesne) Obj öğesini kuyruğun sonuna ekler
E getFirst() Kuyruktaki ilk elemanı döndürür
E getLast() Kuyruktaki son öğeyi döndürür
boolean OfferFirst(Õ nesne) Obj öğesini kuyruğun önüne ekler ve öğe eklenirse true değerini döndürür. Aksi takdirde, false döndürür .
boolean OfferLast(E nesne) Obj öğesini kuyruğun sonuna ekler ve öğe eklenirse true değerini döndürür. Aksi takdirde, false döndürür .
E pop() Sıradan ilk öğeyi alır ve kaldırır
geçersiz itme(Õ nesne) obj öğesini kuyruğun önüne ekler
E peekFirst() Kuyruktan ilk öğeyi döndürür (ancak kaldırmaz)
E peekLast() Kuyruktaki son öğeyi döndürür (ancak kaldırmaz)
E pollFirst() Kuyruktaki ilk öğeyi döndürür ve kaldırır. Hiçbir öğe yoksa null döndürür .
E anketSon() Kuyruktaki son öğeyi döndürür ve kaldırır. Hiçbir öğe yoksa null döndürür .
E kaldır Son() Sıranın ilk öğesini döndürür ve kaldırır. Öğe yoksa bir istisna atar.
E removeFirst() Kuyruğun son öğesini döndürür ve kaldırır. Öğe yoksa bir istisna atar.
boolean removeFirstOccurrence(Nesne nesnesi) Sıradaki ilk obj örneğini kaldırır
boolean removeLastOccurrence(Nesne nesnesi) Obj'nin son oluşumunu kuyruktan kaldırır

Şimdi bu yöntemlerden birkaçını pratikte görelim.

Öncelikle kuyruğa bir eleman ekleyelim:


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);
    
[Portakal, Elma, Ananas]

Şimdi bir kuyruktan değerler alalım:


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

Bu kod, kuyruğun ilk ve son öğesini görüntüler.

İlk element: Turuncu
Son element: 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);
    

Bu kodu çalıştırarak şunu elde ederiz:

Portakal
Elma

[Ananas, Limon]

pop() ve poll() arasındaki fark , liste boşsa pop() öğesinin bir NoSuchElementException atması , ancak poll() öğesinin null değerini döndürmesidir .

Şimdi pollFirst() ve pollLast() yöntemlerini ele alacağız .


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);
    
Portakal
Limon
[Elma, Ananas]

Her iki yöntem de kuyruktan bir değer döndürür ve kaldırır.

İşte peekFirst() ve peekLast() yöntemlerinin kullanımına bir örnek:


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);
    
İlk öğe: John
Son öğe: Oliver
[John, Rob, Greg, Max, Oliver]

Her iki yöntem de kuyruktan ilk/son öğeyi döndürür ve bunları kaldırmaz. Sıra boşsa, null döndürülür.

Tebrikler! Bugün Java'da kuyruklarla nasıl çalışılacağını öğrendik. Artık bunları pratikte nasıl kullanacağınızı biliyorsunuz.