Bu yazıda, Java’da Queue(Kuyruk) Nedir, Nasıl Kullanılır, Java Kuyruk Örneği, Java Kuyruk Methodları ve Kuyruk Arayüzü Uygulaması hakkında bilgiler bulacaksınız.
Kuyruk, Java’da öğeleri bir FIFO (İlk Giren İlk Çıkar) düzeninde depolayan doğrusal bir veri yapısı veya bir koleksiyondur.
Kuyruk koleksiyonunun iki ucu vardır, yani ön ve arka. Elemanlar arkadan eklenir ve önden çıkarılır.
Java Queue Nedir?
Bir kuyruk veri yapısı aşağıda gösterildiği gibi temsil edilir:

Yukarıdaki şemada gösterildiği gibi, bir kuyruk, başlangıç (front) ve bitiş (rear) olmak üzere iki noktaya sahip bir yapıdır. Öğeler, arka uçtaki kuyruğa eklenir ve öndeki kuyruktan çıkarılır.
Java’da Queue, java.util paketinin bir parçası olan bir arayüzdür. Kuyruk arabirimi, Java Koleksiyonu arabirimini genişletir.
Kuyruk arabiriminin genel tanımı şöyledir:
1 2 3 | public interface Queue<E> extends Collection<E> |
Kuyruk bir interface olduğu için somutlaştırılamaz. Queue arabiriminin işlevselliğini uygulamak için bazı somut sınıflara ihtiyacımız var. İki sınıf, Queue arabirimini, yani LinkedList ve PriorityQueue‘yu uygular.

Kuyruk veri yapısının başlıca özelliklerinden bazıları şunlardır:
Kuyruk, FIFO (İlk Giren İlk Çıkar) sırasını takip eder. Bu, elemanın kuyruğa en sonunda eklendiği ve başlangıçta kuyruktan kaldırıldığı anlamına gelir.
- Java kuyruğu arabirimi, ekleme, silme vb. gibi Koleksiyon arabiriminin tüm yöntemlerini sağlar.
- LinkedList ve PriorityQueue, Queue arabirimini uygulayan sınıflardır. ArrayBlockingQueue, Queue arabirimini uygulayan başka bir sınıftır.
- Java.util paketinin bir parçası olan Kuyruklar sınırsız kuyruklar olarak sınıflandırılabilirken, java.util.the eşzamanlı paketinde bulunanlar sınırlı kuyruklar olarak sınıflandırılabilir.
- Deque, her iki uçtan da ekleme ve silmeyi destekleyen bir kuyruktur.
- Deque iplik güvenlidir.
- BlockingQueues iş parçacığı için güvenlidir ve üretici-tüketici sorunlarını uygulamak için kullanılır.
- BlockingQueues boş öğelere izin vermez. Boş değerlerle ilgili herhangi bir işlem denenirse bir NullPointerException oluşturulur.
Java’da Kuyruk Nasıl Kullanılır?
Java’da bir kuyruk kullanmak için önce kuyruk arayüzünü aşağıdaki gibi içe aktarmalıyız:
1 2 3 | import java.util.queue; |
yada
1 2 3 | import java.util.*; |
Bu içe aktarıldığında, aşağıda gösterildiği gibi bir kuyruk oluşturabiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 | import java.util.*; class Main { public static void main(String[] args) { Queue<String> ornek1 = new LinkedList<> (); } } |
Queue bir arabirim olduğundan, bir kuyruk nesnesi oluşturmak için Queue arabirimini uygulayan bir LinkedList sınıfı kullanıyoruz.
Benzer şekilde, diğer somut sınıflarla bir sıra oluşturabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.util.*; class Main { public static void main(String[] args) { Queue<String> str_pqueue = new PriorityQueue<> (); Queue<Integer> int_queue = new ArrayDeque<> (); } } |
Kuyruk nesnesi oluşturulduğuna göre, aşağıda gösterildiği gibi add yöntemiyle değerleri sağlayarak kuyruk nesnesini başlatabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.util.*; class Main { public static void main(String[] args) { Queue<String> str_queue = new LinkedList<> (); str_queue.add("BİR"); str_queue.add("İKİ"); str_queue.add("ÜÇ"); System.out.println("Queue içeriği:" + str_queue); } } |
Çıktı:
1 2 3 | Queue içeriği:[BİR, İKİ, ÜÇ] |
Yukarıdaki örnek, bir Queue nesnesinin bildirilmesini ve başlatılmasını gösterir. Ardından, sadece kuyruğun içeriğini yazdırıyoruz.
Java Queue Metotları
Bu bölümde kuyruk için API yöntemlerini tartışacağız. Kuyruk arabirimi, ekleme, silme, göz atma vb. gibi çeşitli işlemleri destekler. Bazı işlemler bir istisna oluştururken, bazıları yöntem başarılı veya başarısız olduğunda belirli bir değer döndürür.
Java 8’de Queue koleksiyonunda belirli bir değişiklik olmadığını unutmayın. Aşağıdaki yöntemler Java 9 vb. gibi Java’nın sonraki sürümlerinde de mevcuttur.
Aşağıdaki tablo tüm bu yöntemleri özetlemektedir.
Method | Method Prototipi | Tanımı |
---|---|---|
add | boolean add(E e) | Kapasite kısıtlamalarını ihlal etmeden kuyruğun sonundaki (kuyruktaki) sıraya öğe ekler. Başarı durumunda true veya kapasite tükendiyse IllegalStateException döndürür. |
peek | E peek() | Kuyruğun başını (ön) kaldırmadan döndürür. |
element | E element() | peek() yöntemiyle aynı işlemi gerçekleştirir. Sıra boş olduğunda NoSuchElementException atar. |
remove | E remove() | Kuyruğun başını kaldırır ve geri döndürür. Kuyruk boşsa NoSuchElementException atar. |
poll | E poll() | Kuyruğun başını kaldırır ve geri döndürür. Kuyruk boşsa, null döndürür. |
offer | boolean offer(E e) | Kapasite kısıtlamalarını ihlal etmeden yeni e öğesini kuyruğa ekleyin. |
size | int size() | Kuyruktaki öğelerin boyutunu veya sayısını döndürür. |
Kuyruk Öğelerini Yineleme
Kuyruk öğelerini forEach döngüsünü kullanarak veya bir yineleyici kullanarak geçebiliriz. Aşağıda verilen program, Kuyruğu geçmek için her iki yaklaşımı da uygular.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.util.*; class Main { public static void main(String[] args) { //Queue tanımlama Queue kuyruk = new LinkedList(); //Queue'e değer ekleme kuyruk.add("Bir"); kuyruk.add("İki"); kuyruk.add("Üç"); kuyruk.add("Dört"); //traverse the Queue using Iterator System.out.println("Yineleyici aracılığıyla Queue öğeleri:"); Iterator iterator = kuyruk.iterator(); while(iterator.hasNext()){ String element = (String) iterator.next(); System.out.print(element + " "); } System.out.println("\n\nfor döngüsü kullanan Queue öğeleri:"); //Queue for loop ile yineleme for(Object object : kuyruk) { String element = (String) object; System.out.print(element + " "); } } } |
Çıktı:
1 2 3 4 5 6 7 | Yineleyici aracılığıyla Queue öğeleri: Bir İki Üç Dört for döngüsü kullanan Queue öğeleri: Bir İki Üç Dört |
Java Queue Uygulaması
Aşağıdaki program, yukarıda açıkladığım metotları göstermektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.util.*; class Main { public static void main(String[] args) { Queue<Integer> q1 = new LinkedList<Integer>(); //add() method q1.add(10); q1.add(20); q1.add(30); q1.add(40); q1.add(50); System.out.println("Queue Elementleri:"+q1); //remove () method System.out.println("Element sil: "+q1.remove()); //element() queue başındaki elementi getir System.out.println("Queue başındaki element: "+q1.element()); //poll () elementi sil ve getir System.out.println("Poll(): Queue başındaki elementi getir: "+q1.poll()); //queue başındaki eleneti getir System.out.println("peek():queue başındaki element: "+q1.peek()); //print Queue elementlerini yazdır System.out.println("Sonuç Queue:"+q1); } } |
Çıktı:
1 2 3 4 5 6 7 8 | Queue Elementleri:[10, 20, 30, 40, 50] Element sil: 10 Queue başındaki element: 20 Poll(): Queue başındaki elementi getir: 20 peek():queue başındaki element: 30 Sonuç Queue:[30, 40, 50] |
Java Queue Dizisi Uygulaması
Queue uygulaması, yığın uygulaması kadar basit değildir. Her şeyden önce, kuyruk arka ve ön olmak üzere iki işaretçi içerir. Ayrıca iki farklı uçta farklı işlemler yapılır.
Dizileri kullanarak kuyruk uygulamak için önce n sayıda kuyruk elemanı tutacak bir dizi tanımlıyoruz.
Daha sonra bu kuyrukta yapılacak aşağıdaki işlemleri tanımlarız.
Enqueue: Kuyruğa bir öğe eklemek için yapılan bir işlem Enqueue’dur (programda QueueEnqueue işlevi). Arka uca bir eleman eklemek için önce kuyruğun dolu olup olmadığını kontrol etmemiz gerekiyor. Doluysa, öğeyi ekleyemeyiz. Arka < n ise, elemanı kuyruğa ekleriz.
Dequeue: Kuyruktan bir öğeyi silme işlemi Dequeue’dur (programda QueueDequeue işlevi). İlk olarak kuyruğun boş olup olmadığını kontrol ediyoruz. Kuyruktan çıkarma işleminin çalışması için kuyrukta en az bir eleman olması gerekir.
Front: Bu yöntem kuyruğun önünü döndürür.
Display: Bu yöntem kuyruğun üzerinden geçer ve kuyruğun öğelerini görüntüler.
Aşağıdaki Java programı, Queue’nun Array uygulamasını gösterir.
Queue.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | class Queue { private static int front, rear, capacity; private static int queue[]; Queue(int size) { front = rear = 0; capacity = size; queue = new int[capacity]; } // Kuyruğa bir element ekler static void queueEnqueue(int item) { // Kuyruk dolumu kontrol eder if (capacity == rear) { System.out.printf("\nQueue Dolu\n"); return; } // Kuyruğun sonuna eleman ekler else { queue[rear] = item; rear++; } return; } //Kuyruktan eleman silir static void queueDequeue() { // check if queue is empty if (front == rear) { System.out.printf("\nQueue boş\n"); return; } // elemanları arkaya bir yer sağa kaydır else { for (int i = 0; i < rear - 1; i++) { queue[i] = queue[i + 1]; } //queue[rear] 0 yap if (rear < capacity) queue[rear] = 0; // azalt rear rear--; } return; } // Queue elementlerini göster static void queueDisplay() { int i; if (front == rear) { System.out.printf("Queue Boş\n"); return; } // önden arkaya hareket ettirin ve öğeleri yazdırın for (i = front; i < rear; i++) { System.out.printf(" %d = ", queue[i]); } return; } // önden queue yazdır static void queueFront() { if (front == rear) { System.out.printf("Queue boş\n"); return; } System.out.printf("\n Queue başındaki elementi yazdır: %d", queue[front]); return; } } |
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.util.*; class Main { public static void main(String[] args) { // Create a queue of capacity 4 Queue q = new Queue(4); System.out.println("Queue Başlat:"); // Queue elementlerini yazdır q.queueDisplay(); // sıraya eleman ekleme q.queueEnqueue(10); q.queueEnqueue(30); q.queueEnqueue(50); q.queueEnqueue(70); // Elementleri yazdır System.out.println("Queue ekleme yapıldıktan sonra:"); q.queueDisplay(); // queue başındaki elementi yazdır q.queueFront(); // queue element ekle q.queueEnqueue(90); // queue elementlerini yazdır q.queueDisplay(); q.queueDequeue(); q.queueDequeue(); System.out.printf("\nİki kuyruktan çıkarma işleminden sonra sıra:"); // Queue elementlerini yazdır q.queueDisplay(); // queue başındaki elementi yazdır q.queueFront(); } } |
Çıktı:
1 2 3 4 5 6 7 8 9 10 11 | Queue Başlat: Queue Boş Queue ekleme yapıldıktan sonra: 10 = 30 = 50 = 70 = Queue başındaki elementi yazdır: 10 Queue Dolu 10 = 30 = 50 = 70 = İki kuyruktan çıkarma işleminden sonra sıra: 50 = 70 = Queue başındaki elementi yazdır: 50 |
Java Queue Linked List Uygulaması
Yukarıdaki programda Queue veri yapısını Arrays kullanarak uyguladığımız gibi Queue’yu Linked List kullanarak da uygulayabiliriz.
Enqueue, dequeue, front ve display ile aynı yöntemleri bu programda uygulayacağız. Aradaki fark, Array yerine Linked List veri yapısını kullanacağımızdır.
Aşağıdaki program, Java’da Queue’nin Bağlantılı Liste uygulamasını gösterir.
LinkedListQueue.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | class LinkedListQueue { private Node front, rear; private int queueSize; // queue boyutu //linked list node private class Node { int data; Node next; } //constructor initially front & rear null; size=0; queue is empty public LinkedListQueue() { front = null; rear = null; queueSize = 0; } //kuyruğun boş olup olmadığını kontrol et public boolean isEmpty() { return (queueSize == 0); } //Öğeyi kuyruğun önünden kaldırın. public int dequeue() { int data = front.data; front = front.next; if (isEmpty()) { rear = null; } queueSize--; System.out.println("Element " + data+ " silindi"); return data; } //Kuyruğun arkasına veri ekleyin. public void enqueue(int data) { Node oldRear = rear; rear = new Node(); rear.data = data; rear.next = null; if (isEmpty()) { front = rear; } else { oldRear.next = rear; } queueSize++; System.out.println("Element " + data+ " verisi eklendi"); } //kuyruğun önünü ve arkasını yazdır public void print_frontRear() { System.out.println("Kuyruğun önü:" + front.data + " Kuyruğun sonu:" + rear.data); } } |
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Main { public static void main(String[] args) { LinkedListQueue queue = new LinkedListQueue(); queue.enqueue(6); queue.enqueue(3); queue.print_frontRear(); queue.enqueue(12); queue.enqueue(24); queue.dequeue(); queue.dequeue(); queue.enqueue(9); queue.print_frontRear(); } } |
Çıktı:
1 2 3 4 5 6 7 8 9 10 11 | Element 6 verisi eklendi Element 3 verisi eklendi Kuyruğun önü:6 Kuyruğun sonu:3 Element 12 verisi eklendi Element 24 verisi eklendi Element 6 silindi Element 3 silindi Element 9 verisi eklendi Kuyruğun önü:12 Kuyruğun sonu:9 |
Sıkça Sorulan Sorular
1) Java’da Kuyruk Nedir?
Cevap: Java’da Queue, öğelerin FIFO (First In, First Out) sıralamasını izleyen doğrusal sıralı bir veri yapısıdır. Bu, kuyruğa ilk eklenen öğenin kaldırılacak ilk öğe olacağı anlamına gelir. Java’da kuyruk, Koleksiyon arabirimini devralan bir arabirim olarak uygulanır.
2) Bir Kuyruk iş parçacığı için güvenli Java mı?
Cevap: Tüm sıralar iş parçacığı için güvenli değildir, ancak Java’daki BlockingQueues iş parçacığı için güvenlidir.
3) Hangisi daha hızlı – Yığın mı Kuyruk mu?
Cevap: Yığın(Stack) daha hızlıdır. Yığında, elemanlar yalnızca bir uçtan işlenir, dolayısıyla kaydırma gerekmez. Ancak kuyrukta, öğeleri eklemek ve silmek için iki farklı işaretçi olduğundan, öğelerin kaydırılması ve ayarlanması gerekir.
4) Kuyruk Türleri Nelerdir?
Cevap: Kuyruklar aşağıdaki tiplerdendir:
Basit sıra
Dairesel sıra
Öncelik sırası
Çift uçlu kuyruk
5) Kuyruk neden kullanılıyor?
Cevap: Kuyruk veri yapısı senkronizasyon amacıyla kullanılır. Kuyruk ayrıca disk ve CPU zamanlaması için de kullanılır.
Sonuç olarak
Bu yazıda, bildirimler, başlatma uygulaması ve yöntemler gibi ayrıntılarıyla birlikte basit kuyrukları açıkladık. Ayrıca Java’da Queue’nin Array ve LinkedList uygulamasını yaptık.
Yorum Yap