{"id":30854,"date":"2022-06-07T22:10:49","date_gmt":"2022-06-07T20:10:49","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=30854"},"modified":"2024-11-27T15:00:59","modified_gmt":"2024-11-27T14:00:59","slug":"java-deque-vs-stack","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/java-deque-vs-stack\/","title":{"rendered":"Java Deque vs. Stack"},"content":{"rendered":"\n<p>In diesem Artikel erf\u00e4hrst du:<\/p>\n\n\n\n<ul class=\"hc-checked-list wp-block-list\"><li>Was sind die Unterschiede zwischen den Datenstrukturen Deque und Stack?<\/li><li>Wie unterscheiden sich die Java-Interfaces bzw. Klassen <code>Deque<\/code> und <code>Stack<\/code>?<\/li><li>Warum sollten wir <code>Deque<\/code> statt <code>Stack<\/code> verwenden?<\/li><\/ul>\n\n\n\n<p>Schauen wir uns zun\u00e4chst einmal die Datenstrukturen an...<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"unterschied-zwischen-deque-und-stack\">Unterschied zwischen Deque und Stack<\/h2>\n\n\n\n<p>Ein Stack ist eine Datenstruktur, die nach dem LIFO-Prinzip arbeitet: Elemente, die zuletzt auf den Stack gelegt werden, werden als erstes wieder entnommen \u2013 und umgekehrt:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-half_600\"><img decoding=\"async\" width=\"600\" height=\"281\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-600x281.png\" alt=\"Deque vs. Stack: Stack-Datenstruktur\" class=\"wp-image-30977\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-600x281.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-224x105.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-336x157.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-504x236.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-672x315.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-400x187.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-800x375.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2-944x442.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/stack-data-structure.v2.png 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption>Stack-Datenstruktur<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Weitere Details findest du im <a href=\"\/de\/algorithmen\/stack-datenstruktur\/\">Hauptartikel \u00fcber die Stack-Datenstruktur<\/a>.<\/p>\n\n\n\n<p>Ein Deque (ausgesprochen \"Deck\") hingegen ist eine Datenstruktur, bei der Elemente auf zwei Seiten eingef\u00fcgt und entnommen werden k\u00f6nnen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"135\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-800x135.png\" alt=\"Deque vs. Stack: Deque-Datenstruktur\" class=\"wp-image-30976\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-800x135.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-224x38.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-336x57.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-504x85.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-672x113.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-400x68.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-600x101.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-944x159.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4-1200x203.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/deque-data-structure.v4.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque-Datenstruktur<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Details findest du im <a href=\"\/de\/algorithmen\/deque-datenstruktur\/\">Hauptartikel \u00fcber die Deque-Datenstruktur<\/a>.<\/p>\n\n\n\n<p>Ein Deque kann als Stack eingesetzt werden, indem Elemente an derselben Seite eingef\u00fcgt und wieder entnommen werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"unterschied-zwischen-java-stack-und-deque\">Unterschied zwischen Java Stack und Deque<\/h2>\n\n\n\n<p>In diesem Abschnitt geht es um die Unterschiede zwischen dem Java-Interface <code>java.util.Deque<\/code> und der Klasse <code>java.util.Stack<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"klasse-vs-interface\">Klasse vs. Interface<\/h3>\n\n\n\n<p><code>Stack<\/code> ist eine Klasse (\u2192 <a href=\"\/de\/algorithmen\/java-stack\/\">alle Details \u00fcber die Stack-Klasse<\/a>), also eine konkrete Implementierung des Stack-Datentyps. <\/p>\n\n\n\n<p><code>Deque<\/code> hingegen ist ein Interface (\u2192 <a href=\"\/de\/algorithmen\/java-deque\/\">alle Details \u00fcber das Deque-Interface<\/a>) und hat mehrere Implementierungen mit unterschiedlichen Eigenschaften. Du kannst also \u2013 basierend auf deinen Anforderungen \u2013 eine <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/java-deque-implementierungen\/\">geeignete Deque-Implementierung ausw\u00e4hlen<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"thread-sicherheit\">Thread-Sicherheit<\/h3>\n\n\n\n<p>Bei der Klasse <code>Stack<\/code> sind alle Methoden mit dem <code>synchronized<\/code>-Keyword versehen. Du kannst <code>Stack<\/code> also problemlos in einer Multithreading-Anwendung einsetzen. <\/p>\n\n\n\n<p>F\u00fcr eine single-threaded Anwendung ist diese Synchronisation allerdings \u00fcberfl\u00fcssig und w\u00fcrde die Performance negativ beeinflussen. Au\u00dferdem ist die Synchronisation durch pessimistische Locks nur in Situationen mit einer hohen Anzahl an Zugriffskonflikten (\"thread contention\") sinnvoll. Andernfalls ist optimistisches Locking sinnvoller.<\/p>\n\n\n\n<p>Das JDK bietet zum einen nicht-threadsichere Implementierungen, die ohne Locks arbeiten (<a href=\"\/de\/algorithmen\/arraydeque-java\/\">ArrayDeque<\/a> und <a href=\"\/de\/algorithmen\/linkedlist-java\/\">LinkedList<\/a>) \u2013 und zum anderen threadsichere Implementierungen, die ein pessimistisches Lock (<a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedblockingdeque-java\/\">LinkedBlockingDeque<\/a>) oder optimistischen Locking (<a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/concurrentlinkeddeque-java\/\">ConcurrentLinkedDeque<\/a>) verwenden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"iteration\">Iteration<\/h3>\n\n\n\n<p>Da <code>Stack<\/code> und <code>Deque<\/code> Collections sind, implementieren sie letztendlich das <code>Iterable<\/code>-Interface, so dass wir komfortabel \u00fcber die enthaltenen Elemente iterieren k\u00f6nnen.<\/p>\n\n\n\n<p>Allerdings unterscheidet sich die Reihenfolge, in der die Iteratoren von Stack und Deque arbeiten, wie das folgende Beispiel zeigt:<\/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\">Stack&lt;String&gt; stack = <span class=\"hljs-keyword\">new<\/span> Stack();\nstack.push(<span class=\"hljs-string\">\"A\"<\/span>);\nstack.push(<span class=\"hljs-string\">\"B\"<\/span>);\nstack.push(<span class=\"hljs-string\">\"C\"<\/span>);\n\nSystem.out.println(<span class=\"hljs-string\">\"Stack: \"<\/span>);\n<span class=\"hljs-keyword\">for<\/span> (String s : stack) {\n  System.out.println(s);\n}\n\nDeque&lt;String&gt; deque = <span class=\"hljs-keyword\">new<\/span> ArrayDeque();\ndeque.push(<span class=\"hljs-string\">\"A\"<\/span>);\ndeque.push(<span class=\"hljs-string\">\"B\"<\/span>);\ndeque.push(<span class=\"hljs-string\">\"C\"<\/span>);\n\nSystem.out.println(<span class=\"hljs-string\">\"\\nDeque: \"<\/span>);\n<span class=\"hljs-keyword\">for<\/span> (String s : deque) {\n  System.out.println(s);\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>Die Ausgabe dieses Beispiel-Codes lautet:<\/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\">Stack: \nA\nB\nC\n\nDeque: \nC\nB\nA<\/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>Der Iterator von <code>Stack<\/code> iteriert \u00fcber die Elemente von unten nach oben, also in der Reihenfolge des Einf\u00fcgens. Der Iterator von <code>Deque<\/code> hingegen iteriert von oben nach unten, also in Entnahmereihenfolge.<\/p>\n\n\n\n<p>Um \u00fcber ein <code>Deque<\/code> in Einf\u00fcgereihenfolge zu iterieren, kann \u00fcber die Methode <code>descendingIterator()<\/code> ein entsprechender Iterator abgerufen werden:<\/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\"><span class=\"hljs-keyword\">for<\/span> (Iterator&lt;String&gt; iterator = deque.descendingIterator(); iterator.hasNext(); ) {\n  String s = iterator.next();\n  <span class=\"hljs-comment\">\/\/ ... do something with s ...<\/span>\n}\n<\/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<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"verletzung-des-interface-segregation-prinzips\">Verletzung des Interface-Segregation-Prinzips<\/h3>\n\n\n\n<p>Sowohl <code>Stack<\/code> als auch <code>Deque<\/code> bieten weitaus mehr Methoden, als diese Datenstrukturen eigentlich anbieten sollten und verletzen damit das <a href=\"https:\/\/de.wikipedia.org\/wiki\/Interface-Segregation-Prinzip\" target=\"_blank\" rel=\"noopener\">Interface-Segregation-Prinzip<\/a>.<\/p>\n\n\n\n<p>Beide erben Methoden wie <code>remove()<\/code>, <code>removeIf()<\/code>, <code>removeAll()<\/code> und <code>ratainAll()<\/code> von <code>Collection<\/code>. Mit diesen Methoden k\u00f6nnen Elemente aus der Mitte des Stacks bzw. des Deques entfernt werden.<\/p>\n\n\n\n<p><code>Stack<\/code> bietet au\u00dferdem eine <code>insertElementAt()<\/code>-Methode, um ein Element an beliebiger Position des Stacks einzuf\u00fcgen.<\/p>\n\n\n\n<p><code>Deque<\/code> bietet die Methoden <code>removeFirstOccurrence()<\/code> und <code>removeLastOccurrence()<\/code>, mit denen ebenfalls Elemente entnommen werden k\u00f6nnen, die nicht am Kopf bzw. Ende des Deques liegen.<\/p>\n\n\n\n<p>Wie ein Stack-Interface eigentlich aussehen sollte, erf\u00e4hrst du im Artikel \"<a href=\"\/de\/algorithmen\/stack-implementieren\/\">Stack in Java implementieren<\/a>\".<\/p>\n\n\n\n<p>Wie ein Deque-Interface aussehen sollte, liest du in \"<a href=\"\/de\/algorithmen\/deque-implementieren-array\/\">Deque mit einem Array implementieren<\/a>\".<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"warum-wir-deque-statt-stack-verwenden-sollten\">Warum wir Deque statt Stack verwenden sollten<\/h2>\n\n\n\n<p>Als in Java 6 das <code>Deque<\/code>-Interface eingef\u00fchrt wurde, wurde die <code>Stack<\/code>-Klasse mit folgendem Hinweis versehen:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><em>\"A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class.\"<\/em><\/p>\n\n\n\n<p>Dass das Deque-Interface konsistenter ist als Stack, sehe ich nicht. Beide Interfaces haben zahlreiche Methoden, die eine Stack- bzw. eine Deque-Datenstruktur eigentlich nicht haben sollte (s. Abschnitt \"<a href=\"#verletzung-des-interface-segregation-prinzips\">Verletzung des Interface-Segregation-Prinzips<\/a>\" oben).<\/p>\n\n\n\n<p>Dennoch stimme ich zu, dass wir fortan <code>Deque<\/code> verwenden sollten. <code>Deque<\/code> ist ein Interface und bietet mehrere Implementierungen mit verschiedenen Eigenschaften (s. Abschnitt \"<a href=\"#thread-sicherheit\">Thread-Sicherheit<\/a>\" oben), w\u00e4hrend wir bei <code>Stack<\/code> auf eine Implementierung festgelegt sind.<\/p>\n\n\n\n<p>Wenn wir beispielsweise von nur einem Thread auf unseren Stack zugreifen, ist die Synchronisation von <code>Stack<\/code> \u00fcberfl\u00fcssig, und wir sollten lieber ein ArrayDeque einsetzen.<\/p>\n\n\n\n<p>Sch\u00f6ner w\u00e4re es allerdings, wenn die Java-Entwickler zus\u00e4tzlich ein Stack-Interface eingef\u00fchrt h\u00e4tten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung\">Zusammenfassung<\/h2>\n\n\n\n<p>In diesem Artikel hast du die Unterschiede zwischen den Datenstrukturen Stack und Deque sowie den entsprechenden Java-Klassen bzw. -Interfaces kennengelernt. Du hast au\u00dferdem erfahren, warum du Javas <code>Stack<\/code>-Klasse nicht mehr verwenden solltest. Die geeignete Deque-Implementierung f\u00fcr deinen Use Case findest du im Artikel \"<a href=\"\/de\/algorithmen\/java-deque-implementierungen\/\">Java Deque-Implementierungen \u2013 Welche einsetzen?<\/a>\"<\/p>\n\n\n\n<p>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 sind die Unterschiede zwischen den Datenstrukturen und den Java-Klassen Deque und Stack? Warum sollten wir in Java nur noch Deque verwenden?<\/p>\n","protected":false},"author":1,"featured_media":30862,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie unterscheiden sich die Datenstrukturen und die Java-Klassen Deque und Stack? Warum sollten wir in Java nur noch Deque verwenden?","_seopress_robots_index":"","_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":6231,"_post_count":0,"footnotes":""},"categories":[127],"tags":[195],"class_list":["post-30854","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\/man-5866638-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/man-5866638-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 sind die Unterschiede zwischen den Datenstrukturen und den Java-Klassen Deque und Stack? Warum sollten wir in Java nur noch Deque verwenden?","public_identification_id":"0b16d8b267a641c2ba2646c76bcddfee","private_identification_id":"5f0b5defc4054b23a1ed3aab1fb34096","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30854","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=30854"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30854\/revisions"}],"predecessor-version":[{"id":31189,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30854\/revisions\/31189"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/30862"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=30854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=30854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=30854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}