{"id":13451,"date":"2020-06-11T09:02:22","date_gmt":"2020-06-11T07:02:22","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=13451"},"modified":"2025-06-12T09:22:46","modified_gmt":"2025-06-12T07:22:46","slug":"sortieren-in-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/sortieren-in-java\/","title":{"rendered":"Sortieren in Java [Tutorial]"},"content":{"rendered":"\n<p>Dieses Tutorial erkl\u00e4rt \u2013 Schritt f\u00fcr Schritt und mit vielen Code-Beispielen \u2013 wie man in Java primitive Datentypen (<em>ints<\/em>, <em>longs<\/em>, <em>doubles<\/em>, etc.) und Objekte beliebiger Klassen sortieren kann.<\/p>\n\n\n\n<p>Im einzelnen beantwortet der Artikel folgende Fragen:<\/p>\n\n\n\n<ul class=\"wp-block-list hc-checked-list\">\n<li>Wie sortiert man in Java Arrays von primitiven Datentypen?<\/li>\n\n\n\n<li>Wie sortiert man in Java Arrays und Listen von Objekten?<\/li>\n\n\n\n<li>Wie sortiert man in Java parallel?<\/li>\n\n\n\n<li>Welche Sortieralgorithmen verwendet das JDK intern?<\/li>\n<\/ul>\n\n\n\n<p>Der Artikel ist Teil des <a href=\"\/de\/algorithmen\/sortieralgorithmen\/\">Ultimate Guides \u00fcber Sortieralgorithmen<\/a>, der einen \u00dcberblick \u00fcber die g\u00e4ngigsten Sortierverfahren und deren Eigenschaften, wie z. B. deren Zeit- und Platzkomplexit\u00e4t, gibt.<\/p>\n\n\n\n<p>Alle Quellcodes dieses Artikels findest du in meinem <a href=\"https:\/\/github.com\/SvenWoltmann\/sorting-in-java\" target=\"_blank\" rel=\"noopener\">GitHub-Repository<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-kann-man-in-java-sortieren\">Was kann man in Java sortieren?<\/h2>\n\n\n\n<p>Die folgenden Datentypen lassen sich mit Java-Bordmitteln sortieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Arrays von primitiven Datentypen (<code>int[]<\/code>, <code>long[]<\/code>, <code>double[]<\/code>, usw.), <\/li>\n\n\n\n<li>Arrays und Listen von Objekten, die das <code style=\"font-size: 16px;\">Comparable<\/code>-Interface implementieren,<\/li>\n\n\n\n<li>Arrays und Listen von Objekten beliebiger Klassen, mit Angabe eines Comparators, d. h. eines zus\u00e4tzlichen Objekts, das das <code>Comparator<\/code>-Interface implementiert (oder eines entsprechenden Lambdas).<\/li>\n<\/ul>\n\n\n\n<p>Den genauen Unterschied zwischen <code>Comparable<\/code> und <code>Comparator<\/code> erkl\u00e4re ich in einem <a href=\"\/de\/java\/comparator-comparable-compareto\/\">separaten Artikel<\/a>. Dort zeige ich auch, wie man seit Java 8 mit <code>Comparator.comparing()<\/code> sehr elegant Comparatoren erstellen und aneinanderreihen kann.<\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"5c918c0177\" src=\"https:\/\/happycoders.kit.com\/5c918c0177\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"arrays-sort-primitive-datentypen-sortieren\">Arrays.sort() \u2013 primitive Datentypen sortieren<\/h2>\n\n\n\n<p>Die Klasse <code>java.util.Arrays<\/code> stellt Sortiermethoden f\u00fcr alle primitiven Datentypen (au\u00dfer <code>boolean<\/code>) bereit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>static void sort(byte[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(char[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(double[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(float[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(int[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(long[] a)<\/code><\/li>\n\n\n\n<li><code>static void sort(short[] a)<\/code><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel: Sortieren eines int-Arrays<\/h4>\n\n\n\n<p>Das folgenden Beispiel zeigt, wie ein <code>int<\/code>-Array sortiert und dann auf der Konsole ausgegeben wird:<\/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\">int<\/span>&#091;] a = {<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">6<\/span>};\nArrays.sort(a);\nSystem.out.println(Arrays.toString(a));<\/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 kurzen Programs 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\">&#091;1, 2, 3, 4, 5, 6, 7, 8, 9]<\/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<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"teilbereiche-eines-arrays-sortieren\">Teilbereiche eines Arrays sortieren<\/h3>\n\n\n\n<p>F\u00fcr jeden der o. g. Datentypen (<code>int<\/code>, <code>long<\/code>, <code>double<\/code>, usw.) gibt es eine \u00fcberladene Methode, die nur einen Teilbereich des Arrays sortiert, z. B.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>static void sort(int[] a<strong>, int fromIndex, int toIndex<\/strong>)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Das folgende Beispiel sortiert nur die ersten f\u00fcnf Elemente des Arrays:<\/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\">int<\/span>&#091;] a = {<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">6<\/span>};\nArrays.sort(a, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">5<\/span>);\nSystem.out.println(Arrays.toString(a));<\/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>Das Programm gibt folgendes aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091;2, 4, 5, 8, 9, 3, 1, 7, 6]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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>Die ersten f\u00fcnf Elemente 2, 4, 5, 8, 9 wurden sortiert, die restlichen vier Elemente 3, 1, 7, 6, sind unver\u00e4ndert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-objekte-sortieren\">Java-Objekte sortieren<\/h2>\n\n\n\n<p>Primitive Datentypen werden nach ihrer nat\u00fcrlichen Ordnung sortiert. Dementsprechend wird unser Beispiel-Array <em>[4, 8, 5, 9, 2, 3, 1, 7, 6]<\/em> nach dem Sortieren zu <em>[1, 2, 3, 4, 5, 6, 7, 8, 9]<\/em>.<\/p>\n\n\n\n<p>Doch in welcher Reihenfolge werden Objekte sortiert?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"integer-und-string-arrays-sortieren\">Integer- und String-Arrays sortieren<\/h3>\n\n\n\n<p>Wie ein <code>Integer<\/code>- oder <code>String<\/code>-Array sortiert wird, versteht jeder Java-Entwickler intuitiv:<\/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\">Integer&#091;] a = {<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">6<\/span>};\nArrays.sort(a);\nSystem.out.println(Arrays.toString(a));<\/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>Auch hier bekommen wir:<\/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\">&#091;1, 2, 3, 4, 5, 6, 7, 8, 9]<\/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>Sortieren wir ein paar Vornamen:<\/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\">String&#091;] names = {<span class=\"hljs-string\">\"Susan\"<\/span>, <span class=\"hljs-string\">\"Thomas\"<\/span>, <span class=\"hljs-string\">\"Judith\"<\/span>, <span class=\"hljs-string\">\"Daniel\"<\/span>, <span class=\"hljs-string\">\"Eva\"<\/span>, <span class=\"hljs-string\">\"Ben\"<\/span>,\n      <span class=\"hljs-string\">\"Antonia\"<\/span>, <span class=\"hljs-string\">\"Paul\"<\/span>};\nArrays.sort(names);\nSystem.out.println(Arrays.toString(names));<\/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<p>Das Ergebnis lautet \u2013 wie erwartet: <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091;Antonia, Ben, Daniel, Eva, Judith, Paul, Susan, Thomas]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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><code>Integer<\/code>-Objekte werden also offensichtlich genau so wie <code>int<\/code>-Primitive sortiert. Und Strings alphabetisch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"objekte-eigener-klassen-sortieren\">Objekte eigener Klassen sortieren<\/h3>\n\n\n\n<p>Doch wie sortiert man seine selbstgebaute <code>Customer<\/code>-Klasse? Oder eine <code>Invoice<\/code>? <\/p>\n\n\n\n<p>Probieren wir es aus! Hier zun\u00e4chst unsere <code>Customer<\/code>-Klasse:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" 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\">Customer<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> id;\n  <span class=\"hljs-keyword\">private<\/span> String firstName;\n  <span class=\"hljs-keyword\">private<\/span> String lastName;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Customer<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> id, String firstName, String lastName)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.id = id;\n    <span class=\"hljs-keyword\">this<\/span>.firstName = firstName;\n    <span class=\"hljs-keyword\">this<\/span>.lastName = lastName;\n  }\n\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> <span class=\"hljs-string\">\"Customer{\"<\/span> +\n          <span class=\"hljs-string\">\"id=\"<\/span> + id +\n          <span class=\"hljs-string\">\", firstName='\"<\/span> + firstName + <span class=\"hljs-string\">''<\/span><span class=\"hljs-string\">' +\n          \", lastName='<\/span><span class=\"hljs-string\">\" + lastName + ''' +\n          '}';\n  }<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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>Wir versuchen diese mit <code>Arrays.sort()<\/code> zu sortieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Customer&#091;] customers = {\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">43423<\/span>, <span class=\"hljs-string\">\"Elizabeth\"<\/span>, <span class=\"hljs-string\">\"Mann\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">10503<\/span>, <span class=\"hljs-string\">\"Phil\"<\/span>, <span class=\"hljs-string\">\"Gruber\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">61157<\/span>, <span class=\"hljs-string\">\"Patrick\"<\/span>, <span class=\"hljs-string\">\"Sonnenberg\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">28378<\/span>, <span class=\"hljs-string\">\"Marina\"<\/span>, <span class=\"hljs-string\">\"Metz\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">57299<\/span>, <span class=\"hljs-string\">\"Caroline\"<\/span>, <span class=\"hljs-string\">\"Albers\"<\/span>)\n};\nArrays.sort(customers);\nSystem.out.println(Arrays.toString(customers));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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>Diesen Versuch quittiert Java mit folgender Fehlermeldung:<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><em>Exception in thread \"main\" java.lang.ClassCastException: <\/em><br><em>class eu.happycoders.sorting.Customer cannot be cast to class java.lang.Comparable<\/em><\/p>\n\n\n\n<p>Java wei\u00df ohne zus\u00e4tzliche Informationen nicht, wie <code>Customer<\/code>-Objekte sortiert werden sollen. Wie stellen wir diese Informationen bereit? Das erf\u00e4hrst du im n\u00e4chsten Kapitel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sortieren-mit-comparable-und-comparator\">Sortieren mit Comparable und Comparator<\/h2>\n\n\n\n<p>Die Sortier-Instruktionen k\u00f6nnen wir auf zwei unterschiedliche Arten bereitstellen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>indem wir die Klasse <code>Customer<\/code> das Interface <code>java.lang.Comparable<\/code> implementieren lassen (so wie von der Fehlermeldung gefordert) oder<\/li>\n\n\n\n<li>indem wir der <code>Arrays.sort()<\/code>-Methode eine Implementierung des Interfaces <code>java.util.Comparator<\/code> mitgeben.<\/li>\n<\/ol>\n\n\n\n<p>Die beiden Varianten werden in den folgenden zwei Abschnitten beschrieben. Einen tieferen Einblick in die Interfaces <code>Comparable<\/code> und <code>Comparator<\/code> bietet der Artikel <a href=\"\/de\/java\/comparator-comparable-compareto\/\">\"Comparator, Comparable und compareTo \u2013 Vergleichen von Objekten in Java\"<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sortieren-mit-comparable\">Sortieren mit Comparable<\/h3>\n\n\n\n<p>Das Interface <code>java.lang.Comparable<\/code> definiert eine einzige Methode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>public int compareTo(T o)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Diese wird vom Sortieralgorithmus aufgerufen, um zu pr\u00fcfen, ob ein Objekt <em>kleiner<\/em>, <em>gleich<\/em> oder <em>gr\u00f6\u00dfer<\/em> als ein anderes Objekt ist. Je nachdem muss die Methode eine negative Zahl, 0 oder eine positive Zahl zur\u00fcckliefern.<\/p>\n\n\n\n<p>(Wenn du dir die Quellcodes von <code>Integer<\/code> und <code>String<\/code> anschaust, wirst du feststellen, dass beide das <code>Comparable<\/code>-Interface und die <code>compareTo()<\/code>-Methode implementieren.)<\/p>\n\n\n\n<p>Wir wollen unsere Kunden nach Kundennummer sortieren. Dazu m\u00fcssen wir die <code>Customer<\/code>-Klasse wie folgt erweitern (den Konstruktor und die <code>toString()<\/code>-Methode lasse ich hier der \u00dcbersicht halber weg):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" 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\">Customer<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Comparable<\/span>&lt;<span class=\"hljs-title\">Customer<\/span>&gt; <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> id;\n  <span class=\"hljs-keyword\">private<\/span> String firstName;\n  <span class=\"hljs-keyword\">private<\/span> String lastName;\n\n  <span class=\"hljs-comment\">\/\/ Constructor and toString method omitted<\/span>\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">compareTo<\/span><span class=\"hljs-params\">(Customer o)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>.id &lt; o.id ? -<span class=\"hljs-number\">1<\/span> : (<span class=\"hljs-keyword\">this<\/span>.id == o.id ? <span class=\"hljs-number\">0<\/span> : <span class=\"hljs-number\">1<\/span>);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><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 Funktionsweise aus Perspektive der <code>compareTo()<\/code>-Methode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Wenn meine Kundennummer kleiner ist als deine, dann gib -1 zur\u00fcck<\/em>;<\/li>\n\n\n\n<li><em>wenn unsere Kundennummern gleich sind, gib 0 zur\u00fcck<\/em>;<\/li>\n\n\n\n<li><em>ansonsten gib 1 zur\u00fcck.<\/em><\/li>\n<\/ul>\n\n\n\n<p>Etwas k\u00fcrzer wird es, wenn man die Methode <code>Integer.compare()<\/code> verwendet. Diese vergleicht die zwei IDs auf genau die gleiche Art und Weise:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-meta\">@Override<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">compareTo<\/span><span class=\"hljs-params\">(Customer o)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> Integer.compare(<span class=\"hljs-keyword\">this<\/span>.id, o.id);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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>Unsere so erweiterte <code>Customer<\/code>-Klasse k\u00f6nnen wir nun problemlos sortieren lassen (hier noch mal, damit du nicht scrollen musst, das <code>Customer<\/code>-Sortier-Beispiel von oben):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Customer&#091;] customers = {\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">43423<\/span>, <span class=\"hljs-string\">\"Elizabeth\"<\/span>, <span class=\"hljs-string\">\"Mann\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">10503<\/span>, <span class=\"hljs-string\">\"Phil\"<\/span>, <span class=\"hljs-string\">\"Gruber\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">61157<\/span>, <span class=\"hljs-string\">\"Patrick\"<\/span>, <span class=\"hljs-string\">\"Sonnenberg\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">28378<\/span>, <span class=\"hljs-string\">\"Marina\"<\/span>, <span class=\"hljs-string\">\"Metz\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">57299<\/span>, <span class=\"hljs-string\">\"Caroline\"<\/span>, <span class=\"hljs-string\">\"Albers\"<\/span>)\n};\nArrays.sort(customers);\nSystem.out.println(Arrays.toString(customers));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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>Dieses mal l\u00e4uft das Programm ohne Fehler durch und gibt folgendes aus (die Zeilenumbr\u00fcche habe ich der \u00dcbersicht halber manuell eingef\u00fcgt):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091;Customer{id=10503, firstName='Phil', lastName='Gruber'},\n Customer{id=28378, firstName='Marina', lastName='Metz'},\n Customer{id=43423, firstName='Elizabeth', lastName='Mann'},\n Customer{id=57299, firstName='Caroline', lastName='Albers'},\n Customer{id=61157, firstName='Patrick', lastName='Sonnenberg'}]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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>Unsere Kunden sind nun, wie gew\u00fcnscht, nach Kundernnummer sortiert.<\/p>\n\n\n\n<p>Was aber, wenn wir die Kunden f\u00fcr einen anderen Use Case nicht nach Nummern, sondern nach Namen sortieren wollen? Wir k\u00f6nnen ja <code>compareTo()<\/code> nur einmal implementieren. M\u00fcssen wir uns f\u00fcr immer und ewig auf eine Reihenfolge festlegen?<\/p>\n\n\n\n<p>Hier kommt das Interface <code>Comparator<\/code> ins Spiel, das ich im n\u00e4chsten Abschnitt beschreiben werde.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sortieren-mit-einem-comparator\">Sortieren mit einem Comparator<\/h3>\n\n\n\n<p>Mit der <code>Customer.compareTo()<\/code>-Methode haben wir die sogenannte \"nat\u00fcrliche Ordnung\" der Kunden definiert. Mit dem Interface <code>Comparator<\/code> k\u00f6nnen wir beliebig viele weitere Sortierreihenfolgen f\u00fcr eine Klasse definieren.<\/p>\n\n\n\n<p>Analog zur <code>compareTo()<\/code>-Methode definiert das <code>Comparator<\/code>-Interface die folgende Methode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>int compare(T o1, T o2)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Diese wird aufgerufen, um zu pr\u00fcfen, ob das Objekt <code>o1<\/code> <em>kleiner<\/em>, <em>gleich<\/em> oder <em>gr\u00f6\u00dfer<\/em> als das Objekt <code>o2<\/code> ist. Entsprechend muss auch diese Methode eine negative Zahl, 0 oder eine positive Zahl als R\u00fcckgabewert liefern.<\/p>\n\n\n\n<p>Seit Java 8 k\u00f6nnen wir einen Comparator sehr elegant mit <code>Comparator.comparing()<\/code> erstellen. Mit folgendem Code k\u00f6nnen wir die Kunden zun\u00e4chst nach Nachnamen und dann nach Vornamen sortieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Arrays.sort(customers,\n      Comparator.comparing(Customer::getLastName)\n            .thenComparing(Customer::getFirstName));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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>Wie du siehst, kann man hier beinahe in nat\u00fcrlicher Sprache aufschreiben, wie die Kunden sortiert werden sollen.<\/p>\n\n\n\n<p>Den Comparator k\u00f6nnen wir auch in einer Konstanten in der <code>Customer<\/code>-Klasse speichern, um ihn an verschiedenen Stellen wiederzuverwenden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" 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-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> Comparator&lt;Customer&gt; NAME_COMPARATOR = Comparator\n    .comparing(Customer::getLastName)\n    .thenComparing(Customer::getFirstName);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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>Sortieren w\u00fcrden wir die Kunden dann so:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Arrays.sort(customers, Customer.NAME_COMPARATOR);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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>Weitere M\u00f6glichkeiten, um Comparatoren zu erstellen, findest Du <a href=\"\/de\/java\/comparator-comparable-compareto\/#Wie_erstellt_man_einen_Comparator\">in diesem Artikel<\/a>. Probier es einfach mal aus!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sortieren-einer-liste-in-java\">Sortieren einer Liste in Java<\/h2>\n\n\n\n<p>Bis jetzt haben wir ausschlie\u00dflich die folgenden zwei Methoden der Klasse <code>java.util.Arrays<\/code> verwendet, um Objekte zu sortieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>static void sort(Object[] a)<\/code> \u2013 zum Sortieren von Objekten entsprechend ihrer nat\u00fcrlichen Ordnung,<\/li>\n\n\n\n<li><code>static void sort(T[] a, Comparator&lt;? super T&gt; c)<\/code> \u2013 zum Sortieren von Objekten anhand des \u00fcbergebenenen Comparators.<\/li>\n<\/ul>\n\n\n\n<p>Oft haben wir Objekte nicht in einem Array vorliegen, sondern in einer Liste. Um diese zu sortieren, gibt es (seit Java 8) zwei M\u00f6glichkeiten:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"liste-sortieren-mit-collections-sort\">Liste sortieren mit Collections.sort()<\/h3>\n\n\n\n<p>Bis einschlie\u00dflich Java 7 musste die Methode <code>Collections.sort()<\/code> zu Hilfe genommen werden, um eine Liste zu sortieren.<\/p>\n\n\n\n<p>Im folgenden Beispiel sollen wieder unsere Kunden sortiert werden, zun\u00e4chst nach Kundennummer (also entsprechend ihrer \"nat\u00fcrlichen Ordnung\"):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ArrayList&lt;Customer&gt; customers = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;(List.of(\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">43423<\/span>, <span class=\"hljs-string\">\"Elizabeth\"<\/span>, <span class=\"hljs-string\">\"Mann\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">10503<\/span>, <span class=\"hljs-string\">\"Phil\"<\/span>, <span class=\"hljs-string\">\"Gruber\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">61157<\/span>, <span class=\"hljs-string\">\"Patrick\"<\/span>, <span class=\"hljs-string\">\"Sonnenberg\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">28378<\/span>, <span class=\"hljs-string\">\"Marina\"<\/span>, <span class=\"hljs-string\">\"Metz\"<\/span>),\n      <span class=\"hljs-keyword\">new<\/span> Customer(<span class=\"hljs-number\">57299<\/span>, <span class=\"hljs-string\">\"Caroline\"<\/span>, <span class=\"hljs-string\">\"Albers\"<\/span>)\n));\nCollections.sort(customers);\nSystem.out.println(customers);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><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>Das Programm gibt, wie im vorherigen Beispiel auch, die Kunden sortiert nach ihrer Kundennummer aus.<\/p>\n\n\n\n<p>Warum werden im Beispiel zwei Listen erstellt? Eine mit <code>List.of()<\/code> und dann eine weitere mit <code>new ArrayList&lt;&gt;()<\/code>? <\/p>\n\n\n\n<p><code>List.of()<\/code> ist die eleganteste Art eine Liste zu erstellen. Die ist allerdings unver\u00e4nderlich (was in den meisten Anwendungsf\u00e4llen von <code>List.of()<\/code> auch sinnvoll ist) und kann dementsprechend nicht sortiert werden. Daher \u00fcbergebe ich diese dann an den Konstruktor von <code>ArrayList<\/code>, der daraus eine ver\u00e4nderliche Liste macht. Zugegeben: nicht die performanteste L\u00f6sung, sie macht den Code aber sch\u00f6n kurz.<\/p>\n\n\n\n<p><code>Collections.sort()<\/code> pr\u00fcft \u00fcbrigens (im Gegensatz zu <code>Arrays.sort()<\/code>) schon zur Compile-Zeit, ob die \u00fcbergebene Liste aus Objekten besteht, die <code>Comparable<\/code> implementieren.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Liste sortieren mit Collections.sort() und einem Comparator<\/h4>\n\n\n\n<p>Auch einen Comparator kann man <code>Collections.sort()<\/code> mitgeben. Folgende Code-Zeile sortiert die Kunden nach Namen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Collections.sort(customers, Customer.NAME_COMPARATOR);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><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=\"liste-sortieren-mit-list-sort\">Liste sortieren mit List.sort()<\/h3>\n\n\n\n<p>Seit Java 8 gibt es (dank der Default-Methoden in Interfaces) die M\u00f6glichkeit eine Liste direkt mit <code>List.sort()<\/code> zu sortieren. Dabei muss <em>immer<\/em> ein Comparator angegeben werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">customers.sort(Customer.NAME_COMPARATOR);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><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>Der Comparator darf allerdings auch <code>null<\/code> sein, um die Liste entsprechend ihrer nat\u00fcrlichen Ordnung zu sortieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">customers.sort(<span class=\"hljs-keyword\">null<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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>Auch hier bekommen wir eine <em>ClassCastException<\/em>, wenn die \u00fcbergebene Liste Objekte enth\u00e4lt, die nicht <code>Comparable<\/code> implementieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"arrays-parallel-sortieren\">Arrays parallel sortieren<\/h2>\n\n\n\n<p>Seit Java 8 steht jede der Sortiermethoden aus der <code>java.util.Arrays<\/code>-Klasse auch in einer parallelen Variante zur Verf\u00fcgung. Diese verteilt den Sortieraufwand ab einer festgelegten Array-Gr\u00f6\u00dfe (8.192 Elemente von Java 8 bis Java 13; 4.097 Elemente seit Java 14) auf mehrere CPU Cores. Ein Beispiel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>static void parallelSort(double[] a)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Das folgende Beispiel misst die ben\u00f6tigte Zeit f\u00fcr das Sortieren von 100 Millionen <code>double<\/code>-Werten einmal mit <code>Arrays.sort()<\/code> und einmal mit <code>Arrays.parallelSort()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" 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\">DoubleArrayParallelSortDemo<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> NUMBER_OF_ELEMENTS = <span class=\"hljs-number\">100_000_000<\/span>;\n\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-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      sortTest(<span class=\"hljs-string\">\"sort\"<\/span>, Arrays::sort);\n      sortTest(<span class=\"hljs-string\">\"parallelSort\"<\/span>, Arrays::parallelSort);\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">sortTest<\/span><span class=\"hljs-params\">(String methodName, Consumer&lt;<span class=\"hljs-keyword\">double<\/span>&#091;]&gt; sortMethod)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">double<\/span>&#091;] a = createRandomArray(NUMBER_OF_ELEMENTS);\n    <span class=\"hljs-keyword\">long<\/span> time = System.currentTimeMillis();\n    sortMethod.accept(a);\n    time = System.currentTimeMillis() - time;\n    System.out.println(methodName + <span class=\"hljs-string\">\"() took \"<\/span> + time + <span class=\"hljs-string\">\" ms\"<\/span>);\n  }\n\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">double<\/span>&#091;] createRandomArray(<span class=\"hljs-keyword\">int<\/span> n) {\n    ThreadLocalRandom current = ThreadLocalRandom.current();\n    <span class=\"hljs-keyword\">double<\/span>&#091;] a = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">double<\/span>&#091;n];\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; n; i++) {\n      a&#091;i] = current.nextDouble();\n    }\n    <span class=\"hljs-keyword\">return<\/span> a;\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><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>Mein System (DELL XPS 15 mit Core i7-8750H) gibt folgende Messwerte aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">sort() took 9596 ms\nparallelSort() took 2186 ms\nsort() took 9232 ms\nparallelSort() took 1835 ms\nsort() took 8994 ms\nparallelSort() took 1917 ms\nsort() took 9152 ms\nparallelSort() took 1746 ms\nsort() took 8899 ms\nparallelSort() took 1757 ms<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><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>Die jeweils ersten Aufrufe dauern etwas l\u00e4nger, da der HotSpot-Compiler etwas Zeit braucht, um den Code zu optimieren.<\/p>\n\n\n\n<p>Danach ist gut zu sehen, wie das parallele Sortieren etwa f\u00fcnf mal schneller ist als das sequentielle. F\u00fcr sechs Cores ist das ein sehr gutes Ergebnis, da die Parallelisierung nat\u00fcrlich auch einen gewissen Overhead mit sich bringt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sortieralgorithmen-im-java-development-kit-jdk\">Sortieralgorithmen im Java Development Kit (JDK)<\/h2>\n\n\n\n<p>Im JDK werden je nach Aufgabenstellung verschiedene <a href=\"\/de\/algorithmen\/sortieralgorithmen\/\">Sortieralgorithmen<\/a> angewendet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em><a href=\"\/de\/algorithmen\/counting-sort\/\">Counting Sort<\/a><\/em> f\u00fcr <code>byte[]<\/code>, <code>short[]<\/code> und <code>char[]<\/code>, wenn mehr als 64 Bytes bzw. mehr als 1750 Shorts oder Characters sortiert werden.<\/li>\n\n\n\n<li><em><a href=\"\/de\/algorithmen\/quicksort\/#Dual-Pivot_Quicksort\">Dual-Pivot Quicksort<\/a><\/em> f\u00fcr das Sortieren primitiver Datentypen mit <code>Arrays.sort()<\/code>. Hierbei handelt es sich um eine optimierte Variante von Quicksort, kombiniert mit <a href=\"\/de\/algorithmen\/insertion-sort\/\">Insertion Sort<\/a> und Counting Sort. Der Algorithmus erreicht eine <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Zeitkomplexit\u00e4t<\/a> von <em>O(n log n)<\/em> bei vielen Eingabedaten, f\u00fcr die andere Quicksort-Implementierungen in der Regel auf <em>O(n\u00b2)<\/em> zur\u00fcckfallen.<\/li>\n\n\n\n<li><em><a href=\"\/de\/algorithmen\/mergesort\/#Timsort\">Timsort<\/a><\/em> (ein optimiertes <a href=\"\/de\/algorithmen\/mergesort\/#Natural_Mergesort\">Natural Mergesort<\/a> kombiniert mit Insertion Sort) f\u00fcr alle anderen Objekte.<\/li>\n<\/ul>\n\n\n\n<p>Beim parallelen Sortieren werden folgende Algorithmen angewendet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bytes, Shorts, Characters werden niemals parallel sortiert.<\/li>\n\n\n\n<li>F\u00fcr andere primitive Datentypen wird eine Kombination aus <a href=\"\/de\/algorithmen\/quicksort\/\">Quicksort<\/a>, <a href=\"\/de\/algorithmen\/mergesort\/\">Mergesort<\/a>, Insertion Sort und <a href=\"\/de\/algorithmen\/heapsort\/\">Heapsort<\/a> eingesetzt.<\/li>\n\n\n\n<li>F\u00fcr Objekte wird ebenfalls <em>Timsort<\/em> eingesetzt - die parallele Variante allerdings erst bei einer Listengr\u00f6\u00dfe von mehr als 8.192 Elementen; darunter wird die Single-Threaded Variante verwendet, da ansonsten der Overhead gr\u00f6\u00dfer ist als der Gewinn.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusamenfassung\">Zusamenfassung<\/h2>\n\n\n\n<p>Du hast in diesem Artikel gelernt (oder aufgefrischt), wie du in Java primitive Datentypen und Objekte sortieren kannst und welche Sortierverfahren das JDK intern anwendet.<\/p>\n<aside><p>Wenn dir der Artikel weitergeholfen hat, w\u00fcrde ich mich sehr \u00fcber eine positive Bewertung auf meinem <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">ProvenExpert-Profil<\/a> freuen. Dein Feedback hilft mir, meine Inhalte weiter zu verbessern und motiviert mich, neue informative Artikel zu schreiben.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">Bewertung abgeben<\/a><\/p>\r\n                        <p>M\u00f6chtest du auf dem Laufenden bleiben und informiert werden, wenn neue Artikel auf HappyCoders.eu ver\u00f6ffentlicht werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"#\" data-formkit-toggle=\"d8ee997126\">Newsletter-Anmeldung<\/a><\/p><\/aside>","protected":false},"excerpt":{"rendered":"<p>Dieses Tutorial erkl\u00e4rt \u2013 Schritt f\u00fcr Schritt und mit vielen Code-Beispielen \u2013 wie man in Java primitive Datentypen (ints, longs, doubles, etc.) und Objekte beliebiger Klassen sortieren kann.<\/p>\n","protected":false},"author":1,"featured_media":43236,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie sortiert man in Java primitive Datentypen (int, long, double...) und Objekte beliebiger Klassen? Welche Sortieralgorithmen verwendet das JDK?","_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":16412,"_post_count":0,"footnotes":""},"categories":[127],"tags":[129],"class_list":["post-13451","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-sortieralgorithmen"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/06\/sorting-in-java-feature-image.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":"Dieses Tutorial erkl\u00e4rt \u2013 Schritt f\u00fcr Schritt und mit vielen Code-Beispielen \u2013 wie man in Java primitive Datentypen (ints, longs, doubles, etc.) und Objekte beliebiger Klassen sortieren kann.","public_identification_id":"8fc43e3dd617496aa4eee7b2c65cf041","private_identification_id":"469d004e65e2466d8dfc53c60e208938","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/13451","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=13451"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/13451\/revisions"}],"predecessor-version":[{"id":52510,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/13451\/revisions\/52510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/43236"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=13451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=13451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=13451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}