{"id":30256,"date":"2022-06-07T22:01:05","date_gmt":"2022-06-07T20:01:05","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=30256"},"modified":"2024-11-27T15:06:35","modified_gmt":"2024-11-27T14:06:35","slug":"java-deque","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/java-deque\/","title":{"rendered":"Deque-Interface in Java"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nachdem Java in Version 5 das <a href=\"\/de\/algorithmen\/java-queue\/\">Queue-Interface<\/a> bekommen hat, kamen in Java 6 das Interface <code>java.util.Deque<\/code> und die ersten Deque-Implementierungen hinzu.\u00b9<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Implementierungen unterscheiden sich in diversen Eigenschaften (wie bounded\/unbounded, blocking\/non-blocking, threadsicher\/nicht threadsicher). Auf diese Eigenschaften werde ich im Verlauf dieses Tutorials eingehen.<\/p>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Das stimmt nicht ganz: <code>LinkedList<\/code>, eine der Deque-Implementierungen, gibt es bereits seit Java 1.2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-deque-klassenhierarchie\">Java Deque-Klassenhierarchie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hier siehst du zun\u00e4chst einen \u00dcberblick \u00fcber die Deque-Interfaces und -Klassen in Form eines UML-Klassendiagramms:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"499\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-800x499.png\" alt=\"Java Deque-Klassenhierarchie (UML-Klassendiagramm)\" class=\"wp-image-30523\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-800x499.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-504x314.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-672x419.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-600x374.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-944x589.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1-1200x749.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-Deque-class-hierarchy.v2-1.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Java Deque-Klassenhierarchie<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Der kompletten linke Teil des Diagramms wird im <a href=\"\/de\/algorithmen\/queue-datenstruktur\/\">Queue-Tutorial<\/a> behandelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das <a href=\"\/de\/algorithmen\/java-blockingdeque\/\">BlockingDeque-Interface<\/a> werde ich im n\u00e4chsten Teil des Tutorials vorstellen; danach folgen die konkreten Deque-Klassen <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/arraydeque-java\/\">ArrayDeque<\/a>, <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedlist-java\/\">LinkedList<\/a>, <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/concurrentlinkeddeque-java\/\">ConcurrentLinkedDeque<\/a> und <a href=\"\/de\/algorithmen\/linkedblockingdeque-java\/\">LinkedBlockingDeque<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du kannst jederzeit \u00fcber die Navigation am rechten Rand zu den entsprechenden Teilen der Serie springen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-deque-methoden\">Java Deque-Methoden<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das <code>Deque<\/code>-Interface erbt von <code>Queue<\/code> und definiert 15 (!) zus\u00e4tzliche Methoden zum Einf\u00fcgen, Entnehmen und Betrachten von Elementen auf beiden Seiten des Deques (12 Deque-Methoden und 3 Stack-Methoden).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aus Konsistenzgr\u00fcnden wurden die Operationen, die <code>Deque<\/code> bereits von <code>Queue<\/code> erbt, mit neuem Namen neu implementiert \u2013 beispielsweise <code>Queue.add()<\/code> als <code>Deque.addLast()<\/code> und <code>Queue.remove()<\/code> als <code>Deque.removeFirst()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das <code>Deque<\/code>-Interface definiert zus\u00e4tzlich drei Stack-Methoden als Alternativen zu den Deque-Methoden, z.&nbsp;B. <code>Deque.push()<\/code> als Alternative zu <code>Deque.addFirst()<\/code>. Diese Methoden h\u00e4tten eigentlich in ein <a href=\"\/de\/algorithmen\/stack-implementieren\/#stack-interface\">Stack-Interface<\/a> geh\u00f6rt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All diese Queue- und Stack-Methoden habe ich im Folgenden explizit mit aufgef\u00fchrt \u2013 und zwar jeweils bei den \u00e4quivalenten Deque-Methoden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Am Ende dieses Kapitels findest du eine zusammenfassende Tabelle.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"methoden-zum-einfuegen-in-das-deque\">Methoden zum Einf\u00fcgen in das Deque<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Einstieg ein grafischer \u00dcberblick aller Enqueue-Methoden:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"110\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-800x110.png\" alt=\"Methoden zum Einf\u00fcgen in ein Deque: addFirst(), offerFirst(), addLast(), offerLast()\" class=\"wp-image-30381\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-800x110.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-224x31.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-336x46.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-504x69.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-672x92.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-400x55.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-600x83.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-944x130.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3-1200x165.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-addFirst-offerFirst-addLast-offerLast.v3.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Methoden zum Einf\u00fcgen in ein Deque<\/figcaption><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Deque.addFirst() + addLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Methoden f\u00fcgen ein Element am Kopf bzw. am Ende des Deques ein. Bei Erfolg geben die Methoden <code>true<\/code> zur\u00fcck. Wenn ein gr\u00f6\u00dfenbeschr\u00e4nktes (bounded) Deque voll ist, werfen diese Methoden eine <code>IllegalStateException<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.add()<\/code> wird zu <code>Deque.addLast()<\/code> weitergeleitet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>Deque.push()<\/code>-Methode ist das Stack-\u00c4quivalent zu <code>Deque.addFirst()<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Deque.offerFirst() + offerLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Auch <code>offerFirst()<\/code> und <code>offerLast()<\/code> f\u00fcgen Elemente in das Deque ein und geben im Erfolgsfall <code>true<\/code> zur\u00fcck. Wenn ein bounded Deque voll ist, geben diese Methoden <code>false<\/code> zur\u00fcck anstatt eine <code>IllegalStateException<\/code> zu werfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.offer()<\/code> wird zu <code>Deque.offerLast()<\/code> weitergeleitet. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"methoden-zum-entnehmen-aus-dem-deque\">Methoden zum Entnehmen aus dem Deque<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Auch f\u00fcr die Dequeue-Methoden zun\u00e4chst ein grafischer \u00dcberblick:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"147\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-800x147.png\" alt=\"Methoden zum Entfernen aus einem Deque: removeFirst(), pollFirst(), removeLast(), pollLast()\" class=\"wp-image-30383\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-800x147.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-224x41.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-336x62.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-504x93.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-672x123.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-400x74.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-600x110.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-944x173.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2-1200x221.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-removeFirst-pollFirst-removeLast-pollLast.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Methoden zum Entfernen aus einem Deque<\/figcaption><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Deque.removeFirst() + removeLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Die Methoden <code>removeFirst()<\/code> und <code>removeLast()<\/code> entnehmen das Element vom Kopf bzw. Ende des Deques. Wenn das Deque leer ist, werfen sie eine <code>NoSuchElementException<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.remove()<\/code> wird zu <code>Deque.removeFirst()<\/code> weitergeleitet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Deque.pop()<\/code> ist das Stack-\u00c4quivalent zu <code>Deque.removeFirst()<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Deque.pollFirst() + pollLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>pollFirst()<\/code> und <code>pollLast()<\/code> entnehmen ebenfalls das Element vom Kopf bzw. Ende des Deques. Im Gegensatz zu <code>removeFirst()<\/code> und <code>removeLast()<\/code> werfen diese Methode bei einem leeren Deque keine Exception, sondern geben <code>null<\/code> zur\u00fcck.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.poll()<\/code> wird zu <code>Deque.pollFirst()<\/code> weitergeleitet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"methoden-zum-betrachten-des-head-bzw-tail-elements\">Methoden zum Betrachten des Head- bzw. Tail-Elements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Und zum Abschluss ein grafischer \u00dcberblick der Peek-Methoden:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"127\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-800x127.png\" alt=\"Methoden zum Betrachten der Elemente am Anfang und Ende des Deques: getFirst(), peekFirst(), getLast(), peekLast()\" class=\"wp-image-30385\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-800x127.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-224x36.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-336x53.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-504x80.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-672x107.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-400x64.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-600x95.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-944x150.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2-1200x191.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-deque-getFirst-peekFirst-getLast-peekLast.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Methoden zum Betrachten der Elemente am Anfang und Ende des Deques<\/figcaption><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Deque.getFirst() + getLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>getFirst()<\/code>- und <code>getLast()<\/code>-Methoden geben das Element vom Kopf bzw. Ende des Deques zur\u00fcck, ohne es aus dem Deque zu entfernen. Wenn das Deque leer ist, werfen diese Methoden eine <code>NoSuchElementException<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.element()<\/code> wird zu <code>Deque.getFirst()<\/code> weitergeleitet.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Deque.peekFirst() + peekLast()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Auch <code>peekFirst()<\/code> und <code>peekLast()<\/code> geben das Kopf- bzw. Tail-Element zur\u00fcck, ohne es aus dem Deque zu entfernen. Bei einem leeren Deque werfen diese Methoden allerdings keine Exception, sondern geben <code>null<\/code> zur\u00fcck.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die vom <code>Queue<\/code>-Interface geerbte Methode <code>Queue.peek()<\/code> wird zu <code>Deque.peekFirst()<\/code> weitergeleitet. <code>peek()<\/code> ist ebenfalls das Stack-\u00c4quivalent zu <code>peekFirst()<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"deque-methoden-zusammenfassung\">Deque-Methoden \u2013 Zusammenfassung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die folgende Tabelle zeigt noch einmal alle zw\u00f6lf Deque-Methoden, die drei Stack-Methoden und die weitergeleiteten Queue-Methoden gruppiert nach Operation, Seite des Deques und Art der Fehlerbehandlung:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th style=\"border-bottom:none\"><\/th><th colspan=\"2\" style=\"text-align:center;border-bottom:none\">Kopf des Deques<\/th><th colspan=\"2\" style=\"text-align:center;border-bottom:none\">Tail des Deques<\/th><\/tr><tr><th><\/th><th>Exception<\/th><th>R\u00fcckgabewert<\/th><th>Exception<\/th><th>R\u00fcckgabewert<\/th><\/tr><\/thead><tbody><tr><td>Element<br>anh\u00e4ngen<br>(<em>enqueue<\/em>):<\/td><td><code>addFirst(E e)<br>&nbsp;<br>push(E e)<\/code>\u00b2<\/td><td><code>offerFirst(E e)<br>&nbsp;<br>&nbsp;<\/code><\/td><td><code>addLast(E e)<br>add(E e)<\/code>\u00b9<br>&nbsp;<\/td><td><code>offerLast(E e)<br>offer(E e)<\/code>\u00b9<br>&nbsp;<\/td><\/tr><tr><td>Element<br>entnehmen<br>(<em>dequeue<\/em>):<\/td><td><code>removeFirst()<br>remove()<\/code>\u00b9<br><code>pop()<\/code>\u00b2<\/td><td><code>pollFirst()<br>poll()<\/code>\u00b9<br>&nbsp;<\/td><td><code>removeLast()<br>&nbsp;<br>&nbsp;<\/code><\/td><td><code>pollLast()<br>&nbsp;<br>&nbsp;<\/code><\/td><\/tr><tr><td>Element<br>ansehen<br>(<em>examine<\/em>):<\/td><td><code>getFirst()<br>element()<\/code>\u00b9<\/td><td><code>peekFirst()<br>peek()<\/code>\u00b9 \u00b2<\/td><td><code>getLast()<br>&nbsp;<\/code><\/td><td><code>peekLast()<br>&nbsp;<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u00b9 Diese Methoden sind im <code>Queue<\/code>-Interface implementiert und rufen die entsprechenden <code>Deque<\/code>-Methoden auf.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00b2 Diese Stack-Methoden sind zus\u00e4tzlich im <code>Deque<\/code>-Interface definiert. Das JDK enth\u00e4lt leider kein <code>Stack<\/code>-Interface.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-erzeugt-man-ein-deque\">Wie erzeugt man ein Deque?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Interface <code>java.util.Deque<\/code> kann nicht direkt instatiiert werden. Ein Interface beschreibt lediglich, welche Methoden eine Klasse implementieren muss, die dieses Interface implementiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es muss also eine konkreten Deque-Implementierungen ausgew\u00e4hlt werden, z. B. ein <code>ArrayDeque<\/code>:<\/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\">Deque&lt;Integer&gt; deque = <span class=\"hljs-keyword\">new<\/span> ArrayDeque&lt;&gt;();<\/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\">Die konkreten, vom JDK angebotenen <code>Deque<\/code>-Klassen werden in den folgenden Teilen des Tutorials \u2013 mit Erkl\u00e4rung ihrer Eigenschaften \u2013 vorgestellt:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/de\/algorithmen\/arraydeque-java\/\">Java ArrayDeque (mit Beispielen)<\/a><\/li><li><a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedlist-java\/\">Java LinkedList (mit Beispielen)<\/a><\/li><li><a href=\"\/de\/algorithmen\/concurrentlinkeddeque-java\/\">Java ConcurrentLinkedDeque (mit Beispielen)<\/a><\/li><li><a href=\"\/de\/algorithmen\/linkedblockingdeque-java\/\">Java LinkedBlockingDeque (mit Beispielen)<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Welche Implementierung du wann einsetzen solltest erf\u00e4hrst du im Teil \"<a href=\"\/de\/algorithmen\/java-deque-implementierungen\/\">Deque-Implementierungen \u2013 Wann welche einsetzen?<\/a>\"<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"beispiel-wie-benutzt-man-ein-deque\">Beispiel: Wie benutzt man ein Deque?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Java-Code-Beispiel erzeugt genau das Deque, das ich am Anfang des Artikels grafisch dargestellt habe. Danach werden die Elemente wieder entnommen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du findest den Code auch in der Klasse <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/deque\/JavaDequeDemo.java\" target=\"_blank\" rel=\"noopener\">JavaDequeDemo<\/a> im GitHub-Repository des Tutorials.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" 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\">JavaDequeDemo<\/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    <span class=\"hljs-comment\">\/\/ 1.<\/span>\n    Deque&lt;Integer&gt; deque = <span class=\"hljs-keyword\">new<\/span> ArrayDeque&lt;&gt;();\n\n    <span class=\"hljs-comment\">\/\/ 2.<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">20<\/span>; i &lt;= <span class=\"hljs-number\">22<\/span>; i++) {\n      deque.offerFirst(i);\n      System.out.println(<span class=\"hljs-string\">\"deque.offerFirst(\"<\/span> + i + <span class=\"hljs-string\">\") --&gt; deque = \"<\/span> + deque);\n    }\n\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">23<\/span>; i &lt;= <span class=\"hljs-number\">25<\/span>; i++) {\n      deque.offerLast(i);\n      System.out.println(<span class=\"hljs-string\">\"deque.offerLast(\"<\/span> + i + <span class=\"hljs-string\">\")  --&gt; deque = \"<\/span> + deque);\n    }\n\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">26<\/span>; i &lt;= <span class=\"hljs-number\">27<\/span>; i++) {\n      deque.offerFirst(i);\n      System.out.println(<span class=\"hljs-string\">\"deque.offerFirst(\"<\/span> + i + <span class=\"hljs-string\">\") --&gt; deque = \"<\/span> + deque);\n    }\n\n    <span class=\"hljs-comment\">\/\/ 3.<\/span>\n    System.out.println();\n    System.out.println(<span class=\"hljs-string\">\"deque.isEmpty()   = \"<\/span> + deque.isEmpty());\n    System.out.println(<span class=\"hljs-string\">\"deque.peekFirst() = \"<\/span> + deque.peekFirst());\n    System.out.println(<span class=\"hljs-string\">\"deque.peekLast()  = \"<\/span> + deque.peekLast());\n    System.out.println();\n\n    <span class=\"hljs-comment\">\/\/ 4.<\/span>\n    <span class=\"hljs-keyword\">while<\/span> (!deque.isEmpty()) {\n      System.out.println(<span class=\"hljs-string\">\"deque.pollFirst() = \"<\/span> + deque.pollFirst()\n          + <span class=\"hljs-string\">\" --&gt; deque = \"<\/span> + deque);\n      System.out.println(<span class=\"hljs-string\">\"deque.pollLast()  = \"<\/span> + deque.pollLast()\n          + <span class=\"hljs-string\">\" --&gt; deque = \"<\/span> + deque);\n    }\n\n    <span class=\"hljs-comment\">\/\/ 5.<\/span>\n    System.out.println();\n    System.out.println(<span class=\"hljs-string\">\"deque.isEmpty()   = \"<\/span> + deque.isEmpty());\n    System.out.println(<span class=\"hljs-string\">\"deque.peekFirst() = \"<\/span> + deque.peekFirst());\n    System.out.println(<span class=\"hljs-string\">\"deque.peekLast()  = \"<\/span> + deque.peekLast());\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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\">Das Programm macht das Folgende (die Nummern verweisen auf die Quellcode-Kommentare):<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Es erstellt ein Deque. Welches du benutzt, ist f\u00fcr dieses Beispiel unwichtig, da die spezifischen Deque-Eigenschaften f\u00fcr dieses Beispiel irrelevant sind.<\/li><li>Es schreibt mit <code>offerFirst()<\/code> und <code>offerLast()<\/code> einige Werte in das Deque.<\/li><li>Wir geben mit <code>isEmpty()<\/code>, <code>peekFirst()<\/code> und <code>peekLast()<\/code> den Zustand des Deques aus.<\/li><li>Wir entnehmen abwechselnd vom Kopf und vom Ende des Deques Elemente und geben diese aus \u2013 solange, bis das Deque leer ist.<\/li><li>Abschlie\u00dfend schauen wir uns noch einmal den Zustand des Deques an.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Das Programm gibt das Folgende aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">deque.offerFirst(20) --&gt; deque = &#091;20]\ndeque.offerFirst(21) --&gt; deque = &#091;21, 20]\ndeque.offerFirst(22) --&gt; deque = &#091;22, 21, 20]\ndeque.offerLast(23)  --&gt; deque = &#091;22, 21, 20, 23]\ndeque.offerLast(24)  --&gt; deque = &#091;22, 21, 20, 23, 24]\ndeque.offerLast(25)  --&gt; deque = &#091;22, 21, 20, 23, 24, 25]\ndeque.offerFirst(26) --&gt; deque = &#091;26, 22, 21, 20, 23, 24, 25]\ndeque.offerFirst(27) --&gt; deque = &#091;27, 26, 22, 21, 20, 23, 24, 25]\n\ndeque.isEmpty()   = false\ndeque.peekFirst() = 27\ndeque.peekLast()  = 25\n\ndeque.pollFirst() = 27 --&gt; deque = &#091;26, 22, 21, 20, 23, 24, 25]\ndeque.pollLast()  = 25 --&gt; deque = &#091;26, 22, 21, 20, 23, 24]\ndeque.pollFirst() = 26 --&gt; deque = &#091;22, 21, 20, 23, 24]\ndeque.pollLast()  = 24 --&gt; deque = &#091;22, 21, 20, 23]\ndeque.pollFirst() = 22 --&gt; deque = &#091;21, 20, 23]\ndeque.pollLast()  = 23 --&gt; deque = &#091;21, 20]\ndeque.pollFirst() = 21 --&gt; deque = &#091;20]\ndeque.pollLast()  = 20 --&gt; deque = &#091;]\n\ndeque.isEmpty()   = true\ndeque.peekFirst() = null\ndeque.peekLast()  = null\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">Die Funktionsweise des Deques l\u00e4sst sich anhand der Ausgabe gut nachvollziehen.<\/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\">In diesem Artikel hast du das <code>Deque<\/code>-Interface und seine Methoden kennengelernt. An einem Beispiel habe ich die Funktionsweise des Java-Deques gezeigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Teil des Tutorial lernst du das <a href=\"\/de\/algorithmen\/java-blockingdeque\/\">BlockingDeque-Interface<\/a> kennen.<\/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>Wie erstellt und benutzt man eine Queue in Java? Welche Methoden bietet das Queue-Interface? Mit Beispiel-Code!<\/p>\n","protected":false},"author":1,"featured_media":30314,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie erstellt und benutzt man ein Deque in Java? Welche Methoden bietet das Deque-Interface? Welche Deques gibt es? Mit Beispiel-Code!","_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":"java deque,deque interface,deque-interface,deque in java","_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":10061,"_post_count":0,"footnotes":""},"categories":[127],"tags":[195],"class_list":["post-30256","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-deque"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/pizza-2885089-1170x986-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":"Wie erstellt und benutzt man eine Queue in Java? Welche Methoden bietet das Queue-Interface? Mit Beispiel-Code!","public_identification_id":"20a341ca885540ec955364944fe1d924","private_identification_id":"12e966485acc468ba4c82b13c87d870e","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30256","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=30256"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30256\/revisions"}],"predecessor-version":[{"id":31183,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30256\/revisions\/31183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/30314"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=30256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=30256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=30256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}