Java PriorityQueue (Öncelikli Kuyruk) Nedir ve Nasıl Kullanılır? 🥇
🚀 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde Java PriorityQueue sınıfını kullanarak verileri öncelik sırasına göre nasıl yöneteceğinizi öğreneceksiniz.
FIFO (İlk Giren İlk Çıkar) yerine, ögeleri öncelik değerine göre işleyen bu veri yapısının
kurucularını, metotlarını, zaman karmaşıklığını ve özel Comparator kullanımını göreceksiniz.
🧠 Teknik Özet
Konu: Java PriorityQueue sınıfı ve veri önceliği yönetimi
Çözdüğü Problem: Normal kuyruklarda veriler giriş sırasına göre işlenir.
Ancak bazı durumlarda (örneğin görev planlayıcılar, işlem önceliği, acil kuyruklar),
önceliğe göre işlem yapmak gerekir.
PriorityQueue, bu problemi çözer.
Kullanım Adımları:
- PriorityQueue nesnesi oluştur.
- Eleman ekle (
add()veyaoffer()). - En yüksek öncelikli elemanı getir (
peek()) veya çıkar (poll()). - Gerekirse özel bir
Comparatortanımla.
⚙️ Java PriorityQueue Nedir?
PriorityQueue, Java’nın java.util paketinde bulunan bir koleksiyon sınıfıdır.
Elemanları doğal sıralamaya (örneğin alfabetik veya sayısal) göre veya
özel belirlenmiş bir karşılaştırıcı (Comparator) ile sıralar.
- Varsayılan olarak en küçük değer kuyruğun başına yerleşir.
- İç yapısında Priority Heap (öncelikli yığın) kullanır.
- Java 1.5 sürümüyle tanıtılmış, Java SE 8 ile geliştirilmiştir.
- Kapasitesi sınırsızdır, ancak heap temelli sıralama mantığına göre çalışır.
🧩 PriorityQueue Kurucuları (Constructors)
| Yapıcı Metot | Açıklama |
|---|---|
PriorityQueue() | Varsayılan kapasite (11) ile boş kuyruk oluşturur. |
PriorityQueue(int initialCapacity) | Belirtilen kapasiteyle kuyruk oluşturur. |
PriorityQueue(Comparator comp) | Belirtilen karşılaştırıcıya göre sıralama yapan kuyruk oluşturur. |
PriorityQueue(Collection c) | Belirtilen koleksiyondaki elemanlarla kuyruk oluşturur. |
PriorityQueue(SortedSet c) | Sıralı kümeden (SortedSet) elemanları alarak oluşturur. |
🔧 PriorityQueue Kullanım Örneği
import java.util.PriorityQueue;
public class GorevOncelik {
public static void main(String[] args) {
PriorityQueue<String> gorevler = new PriorityQueue<>();
gorevler.add("gorev3");
gorevler.add("gorev1");
gorevler.add("gorev2");
System.out.println("Kuyruktaki görevler: " + gorevler);
System.out.println("En yüksek öncelikli görev (peek): " + gorevler.peek());
}
}
🧠 Bu örnek, alfabetik sıralamaya göre “gorev1”’i en yüksek öncelikli yapar.
🔁 Ters (Azalan) Sıralama
Comparator.reverseOrder() kullanarak kuyruğun sıralama yönünü ters çevirebiliriz.
import java.util.*;
public class TersOncelik {
public static void main(String[] args) {
PriorityQueue<String> tersKuyruk = new PriorityQueue<>(Comparator.reverseOrder());
tersKuyruk.add("A");
tersKuyruk.add("B");
tersKuyruk.add("C");
System.out.println("Ters sırada en öncelikli: " + tersKuyruk.peek());
}
}
🧠 Ters sıralamada “C” en öncelikli elemandır.
⚡ Temel Metotlar
| 🧠 Metot | 💡 Açıklama |
|---|---|
| add(E e) | Elemanı kuyruğa ekler. Başarısız olursa istisna fırlatır. |
| offer(E e) | Elemanı ekler, hata yerine false dönebilir. |
| peek() | En yüksek öncelikli elemanı getirir (kaldırmadan). |
| poll() | En yüksek öncelikli elemanı getirir ve kaldırır. |
| contains(Object o) | Elemanın var olup olmadığını kontrol eder. |
| remove(Object o) | Belirtilen elemanı kuyruktan kaldırır. |
| size() | Kuyruktaki toplam eleman sayısını döndürür. |
| clear() | Kuyruğu tamamen temizler. |
| comparator() | Kullanılan özel Comparator nesnesini döndürür. |
💡 peek() ve poll() Farkı
PriorityQueue<String> kuyruk = new PriorityQueue<>();
kuyruk.add("A");
kuyruk.add("C");
kuyruk.add("B");
System.out.println("Peek: " + kuyruk.peek());
System.out.println("Poll: " + kuyruk.poll());
System.out.println("Yeni Baş: " + kuyruk.peek());
📤 Çıktı:
Peek: A
Poll: A
Yeni Baş: B
🧠 peek() sadece görüntüler, poll() ise getirip siler.
⏱️ Zaman Karmaşıklığı (Time Complexity)
| ⚙️ İşlem | ⏱️ Zaman Karmaşıklığı |
|---|---|
| add() / offer() / poll() | O(log n) |
| peek() | O(1) |
| contains() / remove(Object) | O(n) |
⚠️ PriorityQueue thread-safe değildir. Çoklu iş parçacığı ortamlarında PriorityBlockingQueue kullanılmalıdır.
💬 Sıkça Sorulan Sorular (SSS)
- PriorityQueue FIFO mantığında mı çalışır?
Hayır. FIFO yerine önceliğe göre çalışır. En yüksek öncelikli eleman öne çıkar.
- Elemanlar tamamen sıralı mı tutulur?
Hayır. Sadece en yüksek öncelikli eleman her zaman başta olur.
- Comparator tanımlamazsam ne olur?
Varsayılan olarak elemanlar doğal sıralamaya göre düzenlenir.
- Aynı önceliğe sahip elemanlar ne olur?
Eşit öncelik durumunda hangisinin başa geçeceği belirsizdir (rastgele seçilir).
- İlkel tipleri (int, double) neden ekleyemem?
Koleksiyonlar nesne (Object) tutar. Bu nedenle ilkel tipler Integer, Double gibi sınıflara kutulanır.
🧱 Thread-Safe Kullanım için Alternatif
Çoklu iş parçacığı (multithreading) ortamında güvenli kullanım için:
import java.util.concurrent.PriorityBlockingQueue;
PriorityBlockingQueue<String> guvenliKuyruk = new PriorityBlockingQueue<>();
guvenliKuyruk.add("islem1");
guvenliKuyruk.add("islem2");
🧠 Bu sınıf, PriorityQueue’nun thread-safe versiyonudur.
🏁 Sonuç
Java PriorityQueue, görevleri veya olayları öncelik sırasına göre işlemek için mükemmel bir çözümdür. Logaritmik karmaşıklığı sayesinde büyük veri setlerinde bile hızlı çalışır.
☁️ Bu veri yapısını Rabisu Bulut altyapısında geliştirdiğiniz mikroservislerde veya görev yöneticilerinde öncelikli işlem akışı sağlamak için hemen deneyebilirsiniz!
yaml