Mündəricat
Java-da PriorityBlockingQueue
PriorityBlockingQueue, Java-da BlockingQueue interfeysini həyata keçirən və AbstractQueue sinifini genişləndirən bir sinifdir. Eyni zamanda BlockingQueue məlumat quruluşunu həyata keçirir. Bir PriorityBlockingQueue-un işi a-ya bənzəyir Prioritet Sıra ancaq bir bloklama axtarış əməliyyatını tətbiq edir. Bu, mənbə olmadığı zaman elementlər əlavə etməyə çalışdığımız zaman, OutOfMemoryError-u atacağı deməkdir. Eynilə, növbə boş olduqda elementləri silə bilmirik.
Xüsusiyyətləri
- Sıfır dəyərləri PriorityBlockingQueue-da saxlaya bilmirik.
- Sərhədsizdir və başlanğıc gücü 11 ilə dinamik olaraq böyüyür.
- İterator () və ya spliterator () metodlarından istifadə edərək elementləri müəyyən bir qaydada götürə biləcəyimizə zəmanət yoxdur.
- Elementləri sıralamaq üçün ya Arrays.sort istifadə edə bilərik, ya da xüsusi siniflərdən və ya müqayisələrdən istifadə etmək olar.
- Bir PriorityBlockingQueue-da əlavə etdiyimiz elementlərin ClassCastException atacağı bir Müqayisəli interfeys tətbiq etməsi lazımdır.
- Java-da PriorityBlockingQueue mövzu təhlükəsizdir.
- Prioritet elementləri silmək və başqa bir kolleksiyada saxlamaq üçün draTo () metodundan istifadə edə bilərik.
Hiyerarşi
Java-da PriorityBlockingQueue qurucuları
konstruktor | təsvir |
---|---|
PriorityBlockingQueue () | Tutumu 11 olan standart boş bir PriorityBlockingQueue yaradır |
PriorityBlockingQueue (Kolleksiya c) | Kolleksiyada göstərilən elementlərlə PriorityBlockingQueue yaradır |
PriorityBlockingQueue (int initialCapacity) | Müəyyən edilmiş başlanğıc tutumu olan boş bir PriorityBlockingQueue yaradır |
PriorityBlockingQueue (int başlanğıc gücü, Müqayisələndirici c) | Müəyyən edilmiş başlanğıc tutumu olan boş bir PriorityBlockingQueue yaradır və müqayisə aparatına əsaslanan elementləri sifariş edir |
Java-da PriorityBlockingQueue metodları
Üsul | təsvir | Parametr |
---|---|---|
Mantı əlavə et (String e) | Göstərilən elementi növbənin sonuna əlavə edir | e - əlavə ediləcək element. Qaytarma dəyəri - Doğru |
Boolean addAll (Collection c) | Sıra göstərilən elementlər toplusunu əlavə edir. | c - əlavə ediləcək elementlər toplusu Qaytarma dəyəri - doğrudur |
boşluq təmiz () | Növbədəki bütün elementləri təmizləyir. | |
Müqayisə komparator () | Elementləri sifariş etmək üçün müqayisəni qaytarır | |
Mantiq tərkibində (Nesne o) var | Növbədə göstərilən elementin olub-olmadığını yoxlayır | Qaytarma dəyəri - növbədə element varsa, doğrudur |
BooleanAll (Collection c) ehtiva edir | Növbədə kolleksiyadakı bütün elementlərin olub-olmadığını yoxlayır | Qaytarma dəyəri - növbə bütün elementləri ehtiva edərsə doğrudur |
int drainTo (Koleksiyon c) | Bütün elementləri növbədən çıxarır və göstərilən kolleksiyaya əlavə edir | c - Elementlərin əlavə edilməli olduğu kolleksiya |
int drainTo (Collection c, int maxElements) | Göstərilən maksimum element sayını növbədən çıxarır və göstərilən kolleksiyaya əlavə edir | c - Elementlərin əlavə edilməli olduğu kolleksiya maxElements - Maksimum köçürülə bilən element sayı |
Tamsayı element () | Sıradakı ilk elementi (baş) qaytarır | |
Mantiq bərabərdir (O obyekt) | Növbədə göstərilən bütün elementləri dəqiq qaydada ehtiva etdiyini müqayisə edir | Qaytarma dəyəri - obyekt elementləri növbə ilə uyğun gəlsə doğrudur |
Boole isEmpty () | Növbənin boş olub olmadığını yoxlayır | Qaytarma dəyəri - növbədə dəyər olmadıqda doğrudur |
Təkrarlayıcı iterator () | Növbənin iteratorunu ardıcıllıqla alır | Qaytarma dəyəri - təkrarlayıcı |
Mantı təklifi (Tam e) | Göstərilən elementi quyruq kimi daxil edir | e - əlavə ediləcək element |
Mantı təklifi (Tam e, uzun fasilə, TimeUnit vahidi) | Göstərilən elementi növbəyə əlavə edir | e - əlavə ediləcək element |
Tam say () | Növbənin ilk elementini alır (baş) | Növbənin boş olduğu halda sıfır qaytarır |
Tam say () | Növbənin ilk elementini götürür və silir (baş) | Növbənin boş olduğu halda sıfır qaytarır |
Tam say anketi (uzun fasilə, TimeUnit vahidi) | Element mövcud deyilsə, göstərilən vaxtı gözləyərək baş elementini növbədən alır və çıxarır | fasilə - gözləmə vaxtı |
boş yerə qoyun (Tamsayı e) | Göstərilən elementi növbəyə əlavə edir | e - daxil ediləcək element |
int qalanCapacity () | Tamsayı qaytarır.MAX_VALUE | |
Tamsayı götür () | İlk elementi növbədən çıxarır | |
Mantı sil (Nesne o) | Göstərilən obyektin mövcudluğunu ilk növbəni növbədən çıxarır | o - Sökülməsi lazım olan element Qaytarma dəyəri - növbədə element varsa, doğrudur |
Boolean kaldırAll (Collection c) | Kolleksiyadakı bütün elementlərin ilk meydana gəlməsini mövcud olduqda növbədən çıxarır | c - elementlərin toplanması Qaytarma dəyəri - növbədə kolleksiya varsa doğrudur |
Boolean tutmaAll (Collection c) | Koleksiyonda göstərilən bütün elementləri növbədə saxlayır. Digər elementlər silinəcəkdir | c - saxlanılması lazım olan elementlər toplusu Qaytarma dəyəri - çağırılan metod sayəsində növbə dəyişsə, doğrudur |
int ölçüsü () | Növbənin ölçüsünü götürür | Qaytarma dəyəri - növbənin ölçüsü |
Spliterator spliterator () | Növbədəki elementlərin üzərinə bir ayırıcı qaytarır | |
Tamsayı götür () | Növbənin başını götürür və götürür | |
Obyekt [] toArray () | Bir sıra elementləri müvafiq ardıcıllıqla qaytarır | Qaytarma dəyəri - Növbədəki bütün elementlərin müvafiq ardıcıllıqla düzülməsi |
String toString () | Elementlər kolleksiyasının bir Sətir təmsilini qaytarır | Qaytarma dəyəri - Vergül və boşluqla ayrılmış və [] daxilində olan sıra elementlərinin sətri |
Nümunə: PriorityBlockingQueue-a elementlər əlavə edin
Aşağıdakı nümunə Java-da bir PriorityBlockingQueue-a elementlərin necə əlavə olunacağını göstərir. Add (), offer () və ya put () metodundan istifadə edərək dəyərlər daxil edə bilərik, dəyərlər toplusunu daxil etmək üçün addAll () metodundan istifadə edə bilərik.
import java.util.concurrent.PriorityBlockingQueue; public class AddElementsPriorityBlockingQueue { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); pb.add(30); pb.add(50); pb.add(10); System.out.println("Elements in PriorityBlockingQueue after add: " + pb); PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(); pbq.add(70); pbq.add(90); pb.addAll(pbq); System.out.println("Elements in PriorityBlockingQueue after addAll: " + pb); pb.put(100); System.out.println("Elements in PriorityBlockingQueue after put: " + pb); pb.offer(110); System.out.println("Elements in PriorityBlockingQueue after offer: " + pb); } }
Elements in PriorityBlockingQueue after add: [10, 50, 30] Elements in PriorityBlockingQueue after addAll: [10, 50, 30, 70, 90] Elements in PriorityBlockingQueue after put: [10, 50, 30, 70, 90, 100] Elements in PriorityBlockingQueue after offer: [10, 50, 30, 70, 90, 100, 110]
Nümunə: PriorityBlockingQueue-dan elementləri silin
Aşağıdakı nümunədə, Remove () metodundan istifadə edərək elementlərin necə silinəcəyini göstəririk. Anket () metodundan istifadə edərək baş elementini də çıxara bilərik. Yalnız elementlər toplusunu qorumaq və digər elementləri silmək üçün retainAll () metodundan istifadə edə bilərik, bütün kolleksiya elementlərini çıxarmaq üçün isə RemoveAll () metodundan istifadə edə bilərik.
import java.util.concurrent.PriorityBlockingQueue; public class DeleteElementsPriorityBlockingQueue throws InterruptedException { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); pb.add(30); pb.add(50); pb.add(10); PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(); pbq.add(70); pbq.add(90); pbq.add(100); pb.addAll(pbq); System.out.println("Elements in PriorityBlockingQueue after add: " + pb); pb.remove(); pb.remove(90); System.out.println("Elements in PriorityBlockingQueue after remove: " + pb); Integer val = pb.poll(); System.out.println("Removed element using poll: " + val); Integer value = pb.take(); System.out.println("Removed element using take: " + value); pb.retainAll(pbq); System.out.println("Elements in PriorityBlockingQueue after retainAll: " + pb); pb.removeAll(pbq); System.out.println("Elements in PriorityBlockingQueue after removeAll: " + pb); } }
Elements in PriorityBlockingQueue after add: [10, 50, 30, 70, 90, 100] Elements in PriorityBlockingQueue after remove: [30, 50, 100, 70] Removed element using poll: 30 Removed element using take: 50 Elements in PriorityBlockingQueue after retainAll: [70, 100] Elements in PriorityBlockingQueue after removeAll: []
Misal: PriorityBlockingQueue elementlərinə daxil olun
PriorityBlockingQueue-da müəyyən bir dəyərin olub olmadığını yoxlamaq üçün, ehtiva edən () metodundan, elementlər toplusunun mövcudluğunu yoxlamaq üçün, ehtiva edən () metodundan istifadə edə bilərik. Aşağıdakı nümunədə element () və peek () metodlarından istifadə edərək baş elementin necə alınacağını görə bilərik.
import java.util.concurrent.PriorityBlockingQueue; public class AccessElementsPBQ { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); pb.add(30); pb.add(50); pb.add(10); pb.add(20); pb.add(40); PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(); pbq.add(70); pbq.add(90); pb.addAll(pbq); System.out.println(pb.contains(100)); System.out.println(pb.contains(20)); System.out.println(pb.containsAll(pbq)); System.out.println("Head element using the element() method: " + pb.element()); System.out.println("Head element using the peek method: " + pb.peek()); } }
false true true Head element using the element() method: 10 Head element using the peek method: 10
Nümunə: PriorityBlockingQueue üzərində təkrarlayın
İterator () metodundan istifadə edərək Java-da bir PriorityBlockingQueue-da bütün dəyərləri keçə bilərik.
import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue; public class IteratePBQ { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); pb.add(30); pb.add(50); pb.add(10); pb.add(20); pb.add(40); //Using iterator System.out.println("Using iterator:"); Iterator<Integer> i = pb.iterator(); while(i.hasNext()) System.out.println(i.next()); } }
Using iterator: 10 20 30 50 40
Nümunə: drainTo () metodu
Aşağıda drainTo () metodundan istifadə edərək elementlərin bir kolleksiyadan necə çıxarılacağını və başqa kolleksiyaya köçürülməsinin bir nümunəsidir. DrainTo () metodundan istifadə etdikdən sonra ilk növbənin boş olduğunu və ikinci növbənin pbq-nin dəyərləri ilə dolduğunu görə bilərik.
import java.util.concurrent.PriorityBlockingQueue; public class drainToDemo { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); pb.add(30); pb.add(50); pb.add(10); pb.add(20); pb.add(40); PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(); pb.drainTo(pbq); System.out.println("Elements in the first collection: " + pb); System.out.println("Elements in the second collection: " + pbq); } }
Elements in the first collection: [] Elements in the second collection: [10, 20, 30, 40, 50]
Nümunə: PriorityBlockingQueue-da müqayisədən istifadə
PriorityQueue-da elementləri xüsusi bir müqayisəyə əsasən sifariş edə bilərik. Aşağıdakı nümunədə, ən yüksək elementi baş kimi qaytaran xüsusi bir müqayisəçi yaratırıq.
import java.util.Comparator; import java.util.concurrent.PriorityBlockingQueue; public class ComparatorPBQ { public static void main(String[] args) { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(5, new SampleComparator()); pb.add(30); pb.add(50); pb.add(10); pb.add(20); pb.add(40); System.out.println(pb); } }
Müqayisələndirici.java
import java.util.Comparator; public class SampleComparator implements Comparator<Integer> { @Override public int compare(Integer x, Integer y) { if(x < y) return 1; else return -1; } }
[50, 40, 10, 20, 30]
Nümunə: Bloklama axtarış əməliyyatı
Aşağıda PriorityBlockingQueue istifadə edərək bloklama axtarış əməliyyatını göstərmək üçün bir nümunə verilmişdir. Yeni bir mövzu başladığında, hər tam ədədi yazdırmadan əvvəl bir saniyə gözləyir. Take () metodu, göstərilən vaxt üçün dəyəri gözləyərək elementi alır və silir.
import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; public class BlockingRetrievalDemo { public static void main(String[] args) throws InterruptedException { PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(); new Thread(() -> { System.out.println("Waiting..."); try { while(true) { Integer t = pb.take(); System.out.println("Value: " + t); Thread.sleep(TimeUnit.SECONDS.toMillis(1)); } } catch(Exception e) { e.printStackTrace(); } } ).start(); Thread.sleep(TimeUnit.SECONDS.toMillis(2)); pb.add(10); Thread.sleep(TimeUnit.SECONDS.toMillis(2)); pb.add(20); Thread.sleep(TimeUnit.SECONDS.toMillis(2)); pb.add(30); } }
Waiting... Value: 10 Value: 20 Value: 30
Misal: Kolleksiyadan PriorityBlockingQueue yaratmaq
Aşağıdakı nümunə, a-dan bir PriorityBlockingQueue yaratmaq qaydasını göstərir Əlaqəli siyahı kolleksiya. LinkedList və PriorityBlockingQueue-dəki dəyərləri sadaladığı sırada bir fərq olduğunu görə bilərik.
import java.util.LinkedList; import java.util.concurrent.PriorityBlockingQueue; public class PBQCollection { public static void main(String[] args) { LinkedList<Integer> l = new LinkedList<Integer>(); l.add(10); l.add(80); l.add(40); l.add(20); l.add(30); System.out.println("Elements in LinkedList: " + l); PriorityBlockingQueue<Integer> p = new PriorityBlockingQueue<Integer>(l); System.out.println("Elements in PriorityBlockingQueue: " + p); } }
Elements in LinkedList: [10, 80, 40, 20, 30] Elements in PriorityBlockingQueue: [10, 20, 40, 80, 30]
Nümunə: Daxili komparatordan istifadə edərək çeşidləmə
Dəyəri Java-da bir PriorityBlockingQueue-da daxili müqayisədən istifadə edərək sıralaya bilərik. Aşağıdakı nümunədə, əks müqayisəli daxili reverseOrder metodu istifadə edərək dəyərləri tərs qaydada çap edirik.
import java.util.Comparator; import java.util.concurrent.PriorityBlockingQueue; public class ComparatorPBQDemo { public static void main(String[] args) { PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(5, Comparator.reverseOrder()); pbq.add(20); pbq.add(40); pbq.add(60); pbq.add(80); pbq.add(100); System.out.println(pbq); } }
[100, 80, 40, 20, 60]