{"id":29001,"date":"2022-04-20T17:05:19","date_gmt":"2022-04-20T15:05:19","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29001"},"modified":"2024-11-27T15:01:17","modified_gmt":"2024-11-27T14:01:17","slug":"priorityqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/priorityqueue-java\/","title":{"rendered":"PriorityQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Teil der Tutorialserie stelle ich dir eine Queue vor, die streng genommen gar keine Queue ist: die <code>PriorityQueue<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir befinden uns hier in der Klassenhierarchie:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-800x500.png\" alt=\"PriorityQueue in der Klassenhierarchie\" class=\"wp-image-29002\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityQueue-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>PriorityQueue in der Klassenhierarchie<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-ist-eine-priority-queue\">Was ist eine Priority Queue?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Priority Queue (deutsch: Vorrangwarteschlange) ist keine Queue im klassischen Sinne. Denn die Elemente werden nicht in FIFO-Reihenfolge entnommen, sondern entsprechend ihrer Priorit\u00e4t. Es wird immer das Element mit der h\u00f6chsten Priorit\u00e4t zuerst entnommen \u2013 unabh\u00e4ngig davon, wann es in die Queue eingef\u00fcgt wurde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Beispiel zeigt eine Priority Queue mit Elementen der Priorit\u00e4t 10 (h\u00f6chste Priorit\u00e4t), 20, usw. bis 80 (niedrigste Priorit\u00e4t). Ein weiteres Element mit Priorit\u00e4t 45 wird in die Queue eingef\u00fcgt. Die Queue sorgt dann automatisch daf\u00fcr, dass dieses Element nach dem Element mit der Priorit\u00e4t 40 und vor dem Element mit der Priorit\u00e4t 50 entnommen wird.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-half_600\"><img decoding=\"async\" width=\"600\" height=\"326\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-600x326.png\" alt=\"Einf\u00fcgen eines Elements in eine PriorityQueue\" class=\"wp-image-30376\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-600x326.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-224x122.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-336x183.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-504x274.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-672x365.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-400x217.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-800x435.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2-944x513.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/priority-queue-data-structure.v2.png 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption>Einf\u00fcgen eines Elements in eine PriorityQueue<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"mit-welcher-datenstruktur-wird-eine-priority-queue-implementiert\">Mit welcher Datenstruktur wird eine Priority Queue implementiert? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Priority Queues werden in der Regel mit einem <a href=\"\/de\/algorithmen\/heapsort\/#Was_ist_ein_Heap\">Heap<\/a> implementiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im letzten Teil dieser Tutorialserie werde ich dir zeigen, wie du selbst eine Priority Queue mit einem Heap implementieren kannst.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"eigenschaften-der-java-priorityqueue\">Eigenschaften der Java-PriorityQueue <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Klasse <code>java.util.PriorityQueue<\/code> ergibt sich die Dequeue-Reihenfolge entweder aus der nat\u00fcrlichen Ordnung\u00b9 der Elemente oder entsprechend eines dem Constructor \u00fcbergebenen Comparators\u00b9. Die zugrundeliegende Datenstruktur ist ein Min-Heap, d. h. am Kopf der Queue befindet sich immer das kleinste Element.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Sortierung ist dabei nicht stabil, d. h. zwei Elemente, die entsprechend der Sortierreihenfolge an gleicher Position stehen, werden nicht zwangsl\u00e4ufig in derselben Reihenfolge entnommen, wie sie in die Queue eingef\u00fcgt wurden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>PriorityQueue<\/code> ist weder threadsicher noch blockierend. Als threadsicheres, blockierendes Pendant gibt es die <a href=\"\/de\/algorithmen\/priorityblockingqueue-java\/\">PriorityBlockingQueue<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Queue-Eigenschaften sind:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes less-line-height\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Unterliegende Datenstruktur<\/th><th class=\"has-text-align-center\" data-align=\"center\">Thread-safe?<\/th><th class=\"has-text-align-center\" data-align=\"center\">Blocking\/<br>Non-blocking<\/th><th class=\"has-text-align-center\" data-align=\"center\">Bounded\/<br>Unbounded<\/th><th class=\"has-text-align-center\" data-align=\"center\">Iterator Type<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Min-Heap<br><span style=\"font-size:90%\">(gespeichert in einem Array)<\/span><\/td><td class=\"has-text-align-center\" data-align=\"center\">Nein<\/td><td class=\"has-text-align-center\" data-align=\"center\">Non-blocking<\/td><td class=\"has-text-align-center\" data-align=\"center\">Unbounded<\/td><td class=\"has-text-align-center\" data-align=\"center\">Fail-fast\u00b2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>PriorityQueue<\/code> verst\u00f6\u00dft \u00fcbrigens <em>nicht<\/em> gegen das <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Liskovsches_Substitutionsprinzip\" target=\"_blank\">Liskovsche Substitutionsprinzip<\/a> (Liskov substitution principle, LSP). Denn die Dokumentation des <code>Queue<\/code>-Interfaces besagt: \"Queues typically, <em>but do not necessarily<\/em>, order elements in a FIFO (first-in-first-out) manner.\"<\/p>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Alles \u00fcber die \"nat\u00fcrliche Ordnung\" von Objekten und die Sortierung per Comparator liest du im Artikel \"<a href=\"\/de\/java\/comparator-comparable-compareto\/\">Vergleichen von Objekten in Java<\/a>\".<\/p>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b2 Fail-fast: Der Iterator wirft eine <code>ConcurrentModificationException<\/code>, wenn w\u00e4hrend der Iteration Elemente in die Queue eingef\u00fcgt oder aus dieser entnommen werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"einsatzempfehlung\">Einsatzempfehlung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>PriorityQueue<\/code> kann genau dann eingesetzt werden, wenn eine nicht threadsichere Queue mit oben beschriebener Dequeue-Reihenfolge ben\u00f6tigt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Allerdings ist zu beachten, dass die <code>PriorityQueue<\/code> im JDK nur an sehr wenigen Stellen eingesetzt wird und somit eine gewisse Wahrscheinlichkeit f\u00fcr das Vorhandensein von Bugs existiert (was wenig genutzt wird, wird auch wenig getestet).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"priorityqueue-beispiel\">PriorityQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Beispiel zeigt, wie in Java eine Priority Queue erstellt wird und wie mehrere Zufallszahlen in die Queue geschrieben und dann wieder entnommen werden (\u2192 <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/PriorityQueueExample.java\" target=\"_blank\">Code auf GitHub<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir geben keinen Comparator an, d. h. die <code>Integer<\/code>-Elemente werden entsprechend ihrer nat\u00fcrlichen Ordnung sortiert.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PriorityQueueExample<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <\/span>{\n    Queue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> PriorityQueue&lt;&gt;();\n\n    <span class=\"hljs-comment\">\/\/ Enqueue random numbers<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">8<\/span>; i++) {\n      <span class=\"hljs-keyword\">int<\/span> element = ThreadLocalRandom.current().nextInt(<span class=\"hljs-number\">100<\/span>);\n      queue.offer(element);\n      System.out.printf(<span class=\"hljs-string\">\"queue.offer(%2d)    --&gt;  queue = %s%n\"<\/span>, element, queue);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Dequeue all elements<\/span>\n    <span class=\"hljs-keyword\">while<\/span> (!queue.isEmpty()) {\n      Integer element = queue.poll();\n      System.out.printf(<span class=\"hljs-string\">\"queue.poll() = %2d  --&gt;  queue = %s%n\"<\/span>, element, queue);\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Es folgt eine beispielhafte Ausgabe des Programms.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">queue.offer(80)    --&gt;  queue = &#091;80]\nqueue.offer(14)    --&gt;  queue = &#091;14, 80]\nqueue.offer(10)    --&gt;  queue = &#091;10, 80, 14]\nqueue.offer(50)    --&gt;  queue = &#091;10, 50, 14, 80]\nqueue.offer( 9)    --&gt;  queue = &#091;9, 10, 14, 80, 50]\nqueue.offer(58)    --&gt;  queue = &#091;9, 10, 14, 80, 50, 58]\nqueue.offer(41)    --&gt;  queue = &#091;9, 10, 14, 80, 50, 58, 41]\nqueue.offer( 1)    --&gt;  queue = &#091;1, 9, 14, 10, 50, 58, 41, 80]\nqueue.poll() =  1  --&gt;  queue = &#091;9, 10, 14, 80, 50, 58, 41]\nqueue.poll() =  9  --&gt;  queue = &#091;10, 41, 14, 80, 50, 58]\nqueue.poll() = 10  --&gt;  queue = &#091;14, 41, 58, 80, 50]\nqueue.poll() = 14  --&gt;  queue = &#091;41, 50, 58, 80]\nqueue.poll() = 41  --&gt;  queue = &#091;50, 80, 58]\nqueue.poll() = 50  --&gt;  queue = &#091;58, 80]\nqueue.poll() = 58  --&gt;  queue = &#091;80]\nqueue.poll() = 80  --&gt;  queue = &#091;]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Es ist gut zu sehen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>wie acht Elemente in die Priority Queue eingef\u00fcgt werden,<\/li><li>wie die Elemente in der Priority Queue in vermeintlich zuf\u00e4lliger Reihenfolge dargestellt werden (tats\u00e4chlich handelt es sich um die Array-Repr\u00e4sentation des Min-Heaps),<\/li><li>dass das kleinste Element immer am Kopf der Queue (links) ist,<\/li><li>wie die Elemente in aufsteigender Reihenfolge entnommen werden.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"priorityqueue-mit-einem-comparator\">PriorityQueue mit einem Comparator<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Im vorherigen Beispiel haben wir eine <code>PriorityQueue<\/code> \u00fcber den Default-Konstruktor erstellt. Dies f\u00fchrt dazu, dass die Elemente entsprechend ihrer nat\u00fcrlichen Ordnung sortiert werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir k\u00f6nnen aber auch einen benutzerdefinierten Comparator f\u00fcr die Priority Queue angeben. Im folgenden Beispiel erstellen wir dazu Tasks mit je einem Namen und einer Priorit\u00e4t. Diese Tasks sollen nach Priorit\u00e4t sortiert wieder entnommen werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den Comparator daf\u00fcr definieren wir ganz einfach als:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Comparator&lt;Task&gt; comparator = Comparator.comparing(Task::name);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Falls du mit dieser Schreibweise nicht vertraut bist \u2013 sie erstellt einen Comparator, der Tasks nach Priorit\u00e4t sortiert. Das ist doch viel besser lesbar als der folgende, mit einem Lambda, definierte Comparator:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Comparator&lt;Task&gt; comparator =\n    (task1, task2) -&gt; Integer.compare(task1.priority(), task2.priority());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Hier der vollst\u00e4ndige Beispiel-Code (Klasse <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/PriorityQueueWithCustomComparatorExample.java\" target=\"_blank\">PriorityQueueWithCustomComparatorExample auf GitHub<\/a>):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PriorityQueueWithCustomComparatorExample<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <\/span>{\n    Comparator&lt;Task&gt; comparator = Comparator.comparingInt(Task::priority);\n    Queue&lt;Task&gt; queue = <span class=\"hljs-keyword\">new<\/span> PriorityQueue&lt;&gt;(comparator);\n\n    <span class=\"hljs-comment\">\/\/ Enqueue tasks with random priorities<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">5<\/span>; i++) {\n      String name = <span class=\"hljs-string\">\"Task \"<\/span> + (i + <span class=\"hljs-number\">1<\/span>);\n      <span class=\"hljs-keyword\">int<\/span> priority = ThreadLocalRandom.current().nextInt(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">100<\/span>);\n      Task task = <span class=\"hljs-keyword\">new<\/span> Task(name, priority);\n      queue.offer(task);\n      System.out.printf(<span class=\"hljs-string\">\"queue.offer(%s)    --&gt;  queue = %s%n\"<\/span>, task, queue);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Dequeue all elements<\/span>\n    <span class=\"hljs-keyword\">while<\/span> (!queue.isEmpty()) {\n      System.out.printf(<span class=\"hljs-string\">\"queue.poll() = %s  --&gt;  queue = %s%n\"<\/span>, queue.poll(), queue);\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> record <span class=\"hljs-title\">Task<\/span><span class=\"hljs-params\">(String name, <span class=\"hljs-keyword\">int<\/span> priority)<\/span> <\/span>{\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">toString<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n      <span class=\"hljs-keyword\">return<\/span> name + <span class=\"hljs-string\">\" (prio \"<\/span> + priority + <span class=\"hljs-string\">\")\"<\/span>;\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Eine beispielshafte Ausgabe sieht wie folgt aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">queue.offer(Task 1 (prio 93))    --&gt;  queue = &#091;Task 1 (prio 93)]\nqueue.offer(Task 2 (prio 76))    --&gt;  queue = &#091;Task 2 (prio 76), Task 1 (prio 93)]\nqueue.offer(Task 3 (prio 92))    --&gt;  queue = &#091;Task 2 (prio 76), Task 1 (prio 93), Task 3 (prio 92)]\nqueue.offer(Task 4 (prio 51))    --&gt;  queue = &#091;Task 4 (prio 51), Task 2 (prio 76), Task 3 (prio 92), Task 1 (prio 93)]\nqueue.offer(Task 5 (prio 35))    --&gt;  queue = &#091;Task 5 (prio 35), Task 4 (prio 51), Task 3 (prio 92), Task 1 (prio 93), Task 2 (prio 76)]\nqueue.poll() = Task 5 (prio 35)  --&gt;  queue = &#091;Task 4 (prio 51), Task 2 (prio 76), Task 3 (prio 92), Task 1 (prio 93)]\nqueue.poll() = Task 4 (prio 51)  --&gt;  queue = &#091;Task 2 (prio 76), Task 1 (prio 93), Task 3 (prio 92)]\nqueue.poll() = Task 2 (prio 76)  --&gt;  queue = &#091;Task 3 (prio 92), Task 1 (prio 93)]\nqueue.poll() = Task 3 (prio 92)  --&gt;  queue = &#091;Task 1 (prio 93)]\nqueue.poll() = Task 1 (prio 93)  --&gt;  queue = &#091;]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wir k\u00f6nnen gut erkennen, wie die Tasks entsprechend ihrer Priorit\u00e4t (Prio 51 zuerst, Prio 93 zuletzt) entnommen werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um die Tasks nach Name alphabetisch sortiert zu entnehmen, br\u00e4uchten wir lediglich den Comparator \u00e4ndern in:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Comparator&lt;Task&gt; comparator = Comparator.comparing(Task::name);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"priorityqueue-zeitkomplexitaet\">PriorityQueue Zeitkomplexit\u00e4t<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Aufwand f\u00fcr die Enqueue- und Dequeue-Operationen bei der Java-<code>PriorityQueue<\/code> gleicht dem Aufwand f\u00fcr das Einf\u00fcgen in und Entnehmen aus einem Heap. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Zeitkomplexit\u00e4t f\u00fcr beide Operationen lautet somit: <em>O(n log n)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die Verwendung eines Heaps befindet sich das Element mit der h\u00f6chsten Priority immer automatisch am Kopf der Queue und kann mit konstantem Aufwand entnommen werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Zeitkomplexit\u00e4t f\u00fcr die Peek-Operation betr\u00e4gt somit: <em>O(1)<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Hier findest du eine <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Einf\u00fchrung in das Thema Zeitkomplexit\u00e4t<\/a>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel hat erkl\u00e4rt, was eine Priority Queue im allgemeinen ist, welche Eigenschaften die Java-<code>PriorityQueue<\/code> hat, wann man sie einsetzt, wie man die Dequeue-Reihenfolge mit einem benutzerdefinierten Comparator festlegt und welche Zeitkomplexit\u00e4ten die Operationen der Priority Queue aufweisen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im folgenden Artikel kommen wir zur ersten <a href=\"\/de\/algorithmen\/java-blockingqueue\/#was-ist-eine-blockierende-queue\">blockierenden Queue<\/a>, der <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/\">LinkedBlockingQueue<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du noch Fragen hast, stelle sie gerne \u00fcber die Kommentar-Funktion. M\u00f6chtest du \u00fcber neue Tutorials und Artikel informiert werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist eine Priority Queue? Wie funktioniert die Java PriorityQueue? Welche Eigenschaften hat sie, wie verwendet und konfiguriert man sie?<\/p>\n","protected":false},"author":1,"featured_media":29414,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Was ist eine Priority Queue? Wie funktioniert die Java PriorityQueue? Welche Eigenschaften hat sie, wie verwendet und konfiguriert man sie?","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"none","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"priority queue,PriorityQueue","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[{"_seopress_pro_rich_snippets_type":"none"}],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":9787,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29001","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-queue"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/post-it-3136776-1770x986-1.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Was ist eine Priority Queue? Wie funktioniert die Java PriorityQueue? Welche Eigenschaften hat sie, wie verwendet und konfiguriert man sie?","public_identification_id":"4539436593614b29bcde5b470ef30068","private_identification_id":"fa213a7a387742cbaf7aeaf13f22e7fd","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29001","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=29001"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29001\/revisions"}],"predecessor-version":[{"id":41688,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29001\/revisions\/41688"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29414"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29001"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}