{"id":26864,"date":"2022-01-17T01:20:00","date_gmt":"2022-01-17T00:20:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=26864"},"modified":"2025-06-12T08:43:20","modified_gmt":"2025-06-12T06:43:20","slug":"substring-methode","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/substring-methode\/","title":{"rendered":"Java substring() Methode"},"content":{"rendered":"\n<p>Javas <code>String.substring()<\/code>-Methode ist eine der am h\u00e4ufigsten verwendeten Java-Methoden \u00fcberhaupt (zumindest nach Google-Suchergebnissen). Grund genug, sich die Methode einmal genauer anzuschauen.<\/p>\n\n\n\n<p>Dieser Artikel beschreibt, wie man <code>substring()<\/code> einsetzt, aber auch wie es intern funktioniert. Dabei gab es spannende \u00c4nderungen im Laufe der Java-Releases. Erfahrene Java-Entwickler, die mit der Benutzung der Methode vertraut sind, k\u00f6nnen direkt zum Abschnitt <a href=\"#Wie_funktioniert_die_substring-Methode_in_Java\">\"Wie funktioniert die substring-Methode in Java?\"<\/a> springen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"string-substring\">String.substring()<\/h2>\n\n\n\n<p>Die Methode <code>String.substring()<\/code> gibt einen Teilstring des urspr\u00fcnglichen Strings, basierend auf einem Start- und einem End-Index, zur\u00fcck. Am besten l\u00e4sst sich das an einem Bild erkl\u00e4ren.<\/p>\n\n\n\n<p>Im folgenden Beispiel wird aus dem String \"HappyCoders\" der Teilstring von Position 5 bis 8 extrahiert (die Z\u00e4hlung beginnt bei 0):<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-half_400\"><img decoding=\"async\" width=\"400\" height=\"149\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-400x149.png\" alt=\"Java substring Beispiel\" class=\"wp-image-26995\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-400x149.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-224x83.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-336x125.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-504x188.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-672x250.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example-600x224.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-example.png 800w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><figcaption class=\"wp-element-caption\">Java substring Beispiel<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Beim Aufruf der <code>substring()<\/code>-Methode geben wir als ersten Parameter die Start-Position an, also 5, und als zweiten Parameter die Position <em>nach<\/em> der End-Position, also 9:<\/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\">String string = <span class=\"hljs-string\">\"HappyCoders\"<\/span>;\nString substring = string.substring(<span class=\"hljs-number\">5<\/span>,<span class=\"hljs-number\">9<\/span>);\nSystem.out.println(<span class=\"hljs-string\">\"substring = \"<\/span> + substring);<\/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>Das Programm gibt, wie erwartet, den Teilstring \"Code\" aus. Die L\u00e4nge des Teilstrings entspricht End-Position minus Start-Position, also 9-5 = 4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"substring-einer-bestimmten-laenge\">Substring einer bestimmten L\u00e4nge<\/h3>\n\n\n\n<p>Wie im vorherigen Beispiel gezeigt, m\u00fcssen wir der <code>substring()<\/code>-Methode den Start- und End-Index des Teilstrings \u00fcbergeben. Manchmal kennen wir allerdings nicht den End-Index, sondern die gew\u00fcnschte L\u00e4nge des Teilstrings. <\/p>\n\n\n\n<p>Das ist einfach gel\u00f6st: den End-Index k\u00f6nnen wir als Start-Index plus L\u00e4nge berechnen. Das k\u00f6nnen wir direkt in eine Methode, wie die folgende auslagern:<\/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-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">substring<\/span><span class=\"hljs-params\">(String string, <span class=\"hljs-keyword\">int<\/span> beginIndex, <span class=\"hljs-keyword\">int<\/span> length)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> endIndex = beginIndex + length;\n  <span class=\"hljs-keyword\">return<\/span> string.substring(beginIndex, endIndex);\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>Die Methode k\u00f6nnen wir dann wie folgt aufrufen:<\/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\">String code = substring(<span class=\"hljs-string\">\"HappyCoders\"<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">4<\/span>);<\/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>Eine \u00dcberpr\u00fcfung der Parameter auf G\u00fcltigkeit brauchen wir nicht vorzunehmen; das erledigt die <code>String.substring()<\/code>-Methode. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"substring-bis-zum-ende\">Substring bis zum Ende<\/h3>\n\n\n\n<p>Um einen Teilstring ab einer vorgegebenen Position bis zum Ende des Strings zu erhalten, k\u00f6nnen wir eine \u00fcberladene <code>String.substring()<\/code>-Methode verwenden, bei der man nur den Start-Index angeben muss.<\/p>\n\n\n\n<p>Das folgende <code>substring<\/code>-Beispiel zeigt, wie wir aus dem String \"Do or do not. There is no try.\" den Teilstring von Position 14 bis zum Ende (also den zweiten Satz) extrahieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String yodaQuote = <span class=\"hljs-string\">\"Do or do not. There is no try.\"<\/span>;\nString thereIsNoTry = yodaQuote.substring(<span class=\"hljs-number\">14<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"substring-vom-ende\">Substring vom Ende<\/h3>\n\n\n\n<p>Eine weitere Vorgabe k\u00f6nnte sein, einen Teilstring vorgegebener L\u00e4nge vom Ende des urspr\u00fcnglichen Strings extrahieren zu m\u00fcssen. Dazu m\u00fcssen wir den Start-Index berechnen als L\u00e4nge des Strings minus L\u00e4nge des gew\u00fcnschten Substrings. Auch das sollten wir in eine Methode extrahieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">substringFromEnd<\/span><span class=\"hljs-params\">(String string, <span class=\"hljs-keyword\">int<\/span> length)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> beginIndex = string.length() - length;\n  <span class=\"hljs-keyword\">return<\/span> string.substring(beginIndex);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"1427197203\" src=\"https:\/\/happycoders.kit.com\/1427197203\/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=\"weitere-teilstring-aufgaben\">Weitere Teilstring-Aufgaben<\/h2>\n\n\n\n<p>Dieser Abschnitt zeigt L\u00f6sungen f\u00fcr diverse String\/Teilstring-Aufgaben, die mit anderen Methoden als <code>String.substring()<\/code> gel\u00f6st werden m\u00fcssen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"teilstring-innerhalb-eines-strings-finden\">Teilstring innerhalb eines Strings finden<\/h3>\n\n\n\n<p>Um innerhalb eines vorgegebenen Strings einen bestimmten Teilstring zu finden, setzt du in Java die <code>String.indexOf()<\/code>-Methode ein. Sagen wir, wir wollen die Positionen von \"Happy\" und \"Code\" in \"HappyCoders\" finden. Das funktioniert wie folgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String string = <span class=\"hljs-string\">\"HappyCoders\"<\/span>;\n<span class=\"hljs-keyword\">int<\/span> happyIndex = string.indexOf(<span class=\"hljs-string\">\"Happy\"<\/span>);\n<span class=\"hljs-keyword\">int<\/span> codeIndex = string.indexOf(<span class=\"hljs-string\">\"Code\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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>F\u00fcr \"Happy\" liefert <code>indexOf()<\/code> den Wert 0 zur\u00fcck und f\u00fcr \"Code\" den Wert 5.<\/p>\n\n\n\n<p>Wird der angegebene Teilstring nicht gefunden, gibt <code>indexOf()<\/code> den Wert -1 zur\u00fcck.<\/p>\n\n\n\n<p>Die letzte Position eines Teilstring findet man mit <code>lastIndexOf()<\/code>:<\/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 string = <span class=\"hljs-string\">\"The needs of the many outweigh the needs of the few, or the one.\"<\/span>;\n<span class=\"hljs-keyword\">int<\/span> lastNeedsIndex = string.lastIndexOf(<span class=\"hljs-string\">\"needs\"<\/span>);<\/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>In diesem Beispiel gibt <code>lastIndexOf()<\/code> den Wert 35 zur\u00fcck.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"pruefen-ob-ein-string-einen-substring-enthaelt\">Pr\u00fcfen, ob ein String einen Substring enth\u00e4lt<\/h3>\n\n\n\n<p>Um zu pr\u00fcfen, ob ein String einen bestimmten Teilstring enth\u00e4lt, k\u00f6nnen wir seit Java 5 die Methode <code>String.contains()<\/code> verwenden. Der folgende Code pr\u00fcft beispielsweise, ob der String \"foobar\" den String \"oo\" enth\u00e4lt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String string = <span class=\"hljs-string\">\"foobar\"<\/span>;\n<span class=\"hljs-keyword\">boolean<\/span> containsOo = string.contains(<span class=\"hljs-string\">\"oo\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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>Vor Java 5 m\u00fcssen wir die <code>indexOf()<\/code>-Methode zu Hilfe nehmen:<\/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\">boolean<\/span> containsOo = string.indexOf(<span class=\"hljs-string\">\"oo\"<\/span>) != -<span class=\"hljs-number\">1<\/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>Tats\u00e4chlich ruft die <code>String.contains()<\/code>-Methode intern auch <code>String.indexOf()<\/code> auf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"teilstring-innerhalb-eines-strings-ersetzen\">Teilstring innerhalb eines Strings ersetzen<\/h3>\n\n\n\n<p>Einen Teilstring ersetzen k\u00f6nnen wir in Java mit der <code>String.replace()<\/code>-Methode. Im folgenden Beispiel wird im angegebenen Satz jedes Vorkommnis des Wortes \"the\" durch \"a\" ersetzt:<\/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\">String string = <span class=\"hljs-string\">\"the quick brown fox jumps over the lazy dog\"<\/span>;\nstring = string.replace(<span class=\"hljs-string\">\"the\"<\/span>, <span class=\"hljs-string\">\"a\"<\/span>);<\/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<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"teilstring-innerhalb-eines-strings-loeschen\">Teilstring innerhalb eines Strings l\u00f6schen<\/h3>\n\n\n\n<p>Um einen Teilstring zu l\u00f6schen, k\u00f6nnen wir diesen einfach durch den leeren String <code>\"\"<\/code> ersetzen. Im folgenden Beispiel l\u00f6schen wir jedes Vorkommnis von \"and \":<\/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\">String string = <span class=\"hljs-string\">\"When there is no emotion, there is no motive for violence.\"<\/span>;\nstring = string.replace(<span class=\"hljs-string\">\"no \"<\/span>, <span class=\"hljs-string\">\"\"<\/span>);<\/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<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-funktioniert-die-substring-methode-in-java\">Wie funktioniert die substring-Methode in Java?<\/h2>\n\n\n\n<p>String ist eine der am h\u00e4ufigsten verwendeten Java-Klassen und nimmt oft einen gro\u00dfen Teil des Heaps ein. Kein Wunder, dass String im Laufe der Zeit immer wieder optimiert wurde.<\/p>\n\n\n\n<p>So wurde z. B. die Berechnung des Hash-Werts mehrfach ge\u00e4ndert, und in Java 9 wurden <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/254\" target=\"_blank\">Compact Strings<\/a> eingef\u00fchrt. Seither werden Strings, die ausschlie\u00dflich Latin-1-Zeichen enthalten, mit nur <em>einem<\/em> Byte je Zeichen codiert anstatt mit zwei.<\/p>\n\n\n\n<p>Auch die <code>substring<\/code>-Funktion wurde grundlegend ver\u00e4ndert:<\/p>\n\n\n\n<p>Bis einschlie\u00dflich Java 6 zeigt ein durch <code>substring()<\/code> erzeugter Teilstring auf das gleiche <code>char<\/code>-Array wie der urspr\u00fcngliche String. In den String-Feldern <code>offset<\/code> und <code>count<\/code> wird die Startposition und L\u00e4nge des Teilstrings hinterlegt. <\/p>\n\n\n\n<p>Hier der relevante Teil der <code>substring<\/code>-Methode von Java 1 bis 6:<\/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-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">substring<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> beginIndex, <span class=\"hljs-keyword\">int<\/span> endIndex)<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ ... parameter validation ... <\/span>\n    <span class=\"hljs-keyword\">return<\/span> ((beginIndex == <span class=\"hljs-number\">0<\/span>) &amp;&amp; (endIndex == count)) ? <span class=\"hljs-keyword\">this<\/span> :\n        <span class=\"hljs-keyword\">new<\/span> String(offset + beginIndex, endIndex - beginIndex, value);\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>Wenn der Teilstring den kompletten urspr\u00fcnglichen String umfasst, wird einfach <code>this<\/code> zur\u00fcckgegben. Ansonsten wird der folgende Konstruktor aufgerufen:<\/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\">String(<span class=\"hljs-keyword\">int<\/span> offset, <span class=\"hljs-keyword\">int<\/span> count, <span class=\"hljs-keyword\">char<\/span> value&#091;]) {\n    <span class=\"hljs-keyword\">this<\/span>.value = value;\n    <span class=\"hljs-keyword\">this<\/span>.offset = offset;\n    <span class=\"hljs-keyword\">this<\/span>.count = count;\n}<\/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>Der Teilstring und der urspr\u00fcngliche String teilen sich also ein <code>char<\/code>-Array und unterscheiden sich lediglich durch die <code>offset<\/code>- und <code>count<\/code>-Werte, die den Ausschnitt des <code>char<\/code>-Arrays festlegen. Die JDK-Entwickler versprachen sich dadurch zwei Vorteile:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Weniger Speicherbelegung auf dem Heap<\/li>\n\n\n\n<li>Schnellere Ausf\u00fchrung der <code>substring<\/code>-Methode, als wenn das Array kopiert werden w\u00fcrde<\/li>\n<\/ul>\n\n\n\n<p>Ein wichtiger Aspekt wurde allerdings nicht ber\u00fccksichtigt:<\/p>\n\n\n\n<p>Wenn der urspr\u00fcngliche String nicht mehr ben\u00f6tigt wird, kann der Garbage Collector dessen <code>char<\/code>-Array nicht aufr\u00e4umen, da dieses noch vom Teilstring referenziert wird. Wenn z. B. der urspr\u00fcngliche String 10.000 Zeichen enth\u00e4lt und der Teilstring nur 10 Zeichen, dann w\u00fcrden 9.990 Zeichen, also knapp 20 KB (ein <code>char<\/code> belegt zwei Bytes) Heap verschwendet werden.<\/p>\n\n\n\n<p>Java-Entwicklerinnen und -Entwickler, die sich dessen bewusst waren, arbeiteten oft mit einem der folgenden zwei Workarounds:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String substring = <span class=\"hljs-keyword\">new<\/span> String(string.substring(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>));\nString substring = <span class=\"hljs-string\">\"\"<\/span> + string.substring(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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 in der ersten Zeile aufgerufene String-Konstruktor pr\u00fcft, ob der \u00fcbergebene String ein Teilstring ist. Wenn ja, erstellt er eine Kopie des gew\u00fcnschten Ausschnitts. Die in der zweiten Zeile verwendete String-Verkettung f\u00fchrt erst ab Java 5 zum gew\u00fcnschten Ergebnis (s. u.).<\/p>\n\n\n\n<p>Letztlich wogen die JDK-Entwickler die Vor- und Nachteile der bisherigen L\u00f6sung ab und entschieden sich in Java 7 die Implementierung dahingehend zu \u00e4ndern, dass <code>char<\/code>-Arrays nicht mehr von mehreren Strings geteilt werden; die <code>substring<\/code>-Funktion (bzw. der String-Konstruktor, den sie aufruft) erstellt stattdessen eine Kopie des angeforderten Ausschnitts des <code>char<\/code>-Arrays.<\/p>\n\n\n\n<p>In Java 7 ist <code>substring()<\/code> wie folgt implementiert:<\/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\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">substring<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> beginIndex, <span class=\"hljs-keyword\">int<\/span> endIndex)<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ ... parameter validation ...<\/span>\n    <span class=\"hljs-keyword\">return<\/span> ((beginIndex == <span class=\"hljs-number\">0<\/span>) &amp;&amp; (endIndex == value.length)) ? <span class=\"hljs-keyword\">this<\/span>\n        : <span class=\"hljs-keyword\">new<\/span> String(value, beginIndex, subLen);\n}<\/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>Das sieht auf den ersten Blick gleich aus. Auf den zweiten Blick f\u00e4llt auf, dass <code>count<\/code> durch <code>value.length<\/code> ersetzt wurde, also die L\u00e4nge des <code>char<\/code>-Arrays. Da jeder String sein eigenes <code>char<\/code>-Array hat, werden die Felder <code>offset<\/code> und <code>count<\/code> nicht mehr ben\u00f6tigt.<\/p>\n\n\n\n<p>Au\u00dferdem wird ein anderer String-Konstruktor aufgerufen (mit <code>value<\/code> am Anfang statt am Ende). Dieser Konstruktor sieht wie folgt aus:<\/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-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">String<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">char<\/span> value&#091;], <span class=\"hljs-keyword\">int<\/span> offset, <span class=\"hljs-keyword\">int<\/span> count)<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ ... parameter validation ... <\/span>\n    <span class=\"hljs-keyword\">this<\/span>.value = Arrays.copyOfRange(value, offset, offset+count);\n}<\/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>Es wird also eine Kopie des angefordeten <code>char<\/code>-Array-Ausschnitts erstellt.<\/p>\n\n\n\n<p>In Java 9 wurde die <code>substring<\/code>-Methode noch dahingehend angepasst, dass sie das verwendete Encoding (1-Byte\/Latin 1 bzw. 2-Byte\/UTF-16) ber\u00fccksichtigt; die grundlegende Funktionalit\u00e4t (Aufruf von <code>Arrays.copyOfRange<\/code>) wurde aber beibehalten. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"string-substring-internals-demo\">String.substring-Internals \u2013 Demo<\/h3>\n\n\n\n<p>Ich habe ein kleines Programm geschrieben, um die \u00c4nderung der <code>substring<\/code>-Methode im Laufe der Java-Versionen zu demonstrieren. Du findest den Code auch in diesem <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/string-substring-demo\" target=\"_blank\">GitHub-Repository<\/a>.<\/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\"><span class=\"hljs-keyword\">package<\/span> eu.happycoders.substring;\n\n<span class=\"hljs-keyword\">import<\/span> java.lang.reflect.Field;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubstringInternalsDemo<\/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 class=\"hljs-keyword\">throws<\/span> IllegalAccessException <\/span>{\n    String string = <span class=\"hljs-string\">\"HappyCoders.eu\"<\/span>;\n    String substring = string.substring(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">9<\/span>);\n\n    printDetails(<span class=\"hljs-string\">\"original string\"<\/span>, string);\n    printDetails(<span class=\"hljs-string\">\"substring\"<\/span>, substring);\n    printDetails(<span class=\"hljs-string\">\"substring appended to empty string\"<\/span>, <span class=\"hljs-string\">\"\"<\/span> + substring);\n    printDetails(<span class=\"hljs-string\">\"substring wrapped with new string\"<\/span>, <span class=\"hljs-keyword\">new<\/span> String(substring));\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\">printDetails<\/span><span class=\"hljs-params\">(String name, String string)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> IllegalAccessException <\/span>{\n    System.out.println(name + <span class=\"hljs-string\">\":\"<\/span>);\n    System.out.println(<span class=\"hljs-string\">\"  string identity  : \"<\/span> + identity(string));\n    System.out.println(<span class=\"hljs-string\">\"  string           : \"<\/span> + string);\n\n    Object value = getPrivateField(string, <span class=\"hljs-string\">\"value\"<\/span>);\n    System.out.println(<span class=\"hljs-string\">\"  value&#091;] identity : \"<\/span> + identity(value));\n    System.out.println(<span class=\"hljs-string\">\"  value&#091;]          : \"<\/span> + valueToString(value));\n\n    <span class=\"hljs-comment\">\/\/ Java 1-6: offset + count<\/span>\n    Integer offset = (Integer) getPrivateField(string, <span class=\"hljs-string\">\"offset\"<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (offset != <span class=\"hljs-keyword\">null<\/span>) {\n      System.out.println(<span class=\"hljs-string\">\"  offset           : \"<\/span> + offset);\n    }\n\n    Integer count = (Integer) getPrivateField(string, <span class=\"hljs-string\">\"count\"<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (count != <span class=\"hljs-keyword\">null<\/span>) {\n      System.out.println(<span class=\"hljs-string\">\"  count            : \"<\/span> + count);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Java 9+: coder<\/span>\n    Byte coder = (Byte) getPrivateField(string, <span class=\"hljs-string\">\"coder\"<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (coder != <span class=\"hljs-keyword\">null<\/span>) {\n      System.out.println(<span class=\"hljs-string\">\"  coder            : \"<\/span> + coder);\n    }\n\n    System.out.println();\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">identity<\/span><span class=\"hljs-params\">(Object o)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"@\"<\/span> + Integer.toHexString(System.identityHashCode(o));\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">valueToString<\/span><span class=\"hljs-params\">(Object value)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (value <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;]) {\n      <span class=\"hljs-keyword\">return<\/span> Arrays.toString((<span class=\"hljs-keyword\">byte<\/span>&#091;]) value);\n    }\n\n    <span class=\"hljs-keyword\">if<\/span> (value <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-keyword\">char<\/span>&#091;]) {\n      <span class=\"hljs-keyword\">return<\/span> Arrays.toString((<span class=\"hljs-keyword\">char<\/span>&#091;]) value);\n    }\n\n    <span class=\"hljs-keyword\">return<\/span> value.toString();\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Object <span class=\"hljs-title\">getPrivateField<\/span><span class=\"hljs-params\">(String string, String fieldName)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> IllegalAccessException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> {\n      Field field = String<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>.<span class=\"hljs-title\">getDeclaredField<\/span>(<span class=\"hljs-title\">fieldName<\/span>)<\/span>;\n      field.setAccessible(<span class=\"hljs-keyword\">true<\/span>);\n      <span class=\"hljs-keyword\">return<\/span> field.get(string);\n    } <span class=\"hljs-keyword\">catch<\/span> (NoSuchFieldException e) {\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">null<\/span>;\n    }\n  }\n}\n<\/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>Das Programm zeigt die Identit\u00e4ten und Werte der Strings und Teilstrings und deren internen Felder. Um die oben beschriebenen Workarounds zu testen, werden die Teilstrings einmal mit einem leeren String verkettet und einmal durch <code>new String(\u2026)<\/code> gewrappt.<\/p>\n\n\n\n<p>Damit das Programm auch mit \u00e4lteren Versionen als Java 5 l\u00e4uft, konnte ich <code>java.util.Arrays.toString()<\/code> nicht einsetzen. Eine <a href=\"https:\/\/github.com\/SvenWoltmann\/string-substring-demo\/blob\/main\/src\/eu\/happycoders\/substring\/Arrays.java\" target=\"_blank\" rel=\"noopener\"><code>Arrays<\/code>-Ersatzimplementierung<\/a> liegt ebenfalls im GitHub-Repo.<\/p>\n\n\n\n<p>Wenn wir das Programm mit der \u00e4ltesten noch herunterladbaren Java-Version, Java 1.2, laufen lassen, erhalten wir die folgende Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">original string:\n  string identity  : @b450fff4\n  string           : HappyCoders.eu\n  value&#091;] identity : @b454fff4\n  value&#091;]          : &#091;H, a, p, p, y, C, o, d, e, r, s, ., e, u]\n  offset           : 0\n  count            : 14\n\nsubstring:\n  string identity  : @b42cfff4\n  string           : Code\n  value&#091;] identity : @b454fff4\n  value&#091;]          : &#091;H, a, p, p, y, C, o, d, e, r, s, ., e, u]\n  offset           : 5\n  count            : 4\n\nsubstring appended to empty string:\n  string identity  : @b42cfff4\n  string           : Code\n  value&#091;] identity : @b454fff4\n  value&#091;]          : &#091;H, a, p, p, y, C, o, d, e, r, s, ., e, u]\n  offset           : 5\n  count            : 4\n\nsubstring wrapped with new string:\n  string identity  : @bf34fff4\n  string           : Code\n  value&#091;] identity : @bf30fff4\n  value&#091;]          : &#091;C, o, d, e]\n  offset           : 0\n  count            : 4<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><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>Wir k\u00f6nnen sehen, dass String, Teilstring und der mit \"\" verkettete Teilstring alle auf das identische <code>char<\/code>-Array @b454fff4 verweisen. Der mit <code>new String(\u2026)<\/code> erzeugte String hingegen verwendet ein separates <code>char<\/code>-Array, das nur den Text \"Code\" enth\u00e4lt.<\/p>\n\n\n\n<p>In Java 1.3 und 1.4 f\u00fchrt die String-Verkettung zu einem anderen Ergebnis (die vollst\u00e4ndige Ausgabe f\u00fcr alle Java-Versionen findest du im <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/string-substring-demo\/tree\/main\/results\" target=\"_blank\">results-Verzeichnis<\/a> auf GitHub):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">...\n\nsubstring appended to empty string:\n  string identity  : @20c10f\n  string           : Code\n  value&#091;] identity : @62eec8\n  value&#091;]          : &#091;C, o, d, e,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ]\n  offset           : 0\n  count            : 4\n\n...<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><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>Das liegt daran, dass in diesen Versionen ein <code>StringBuffer<\/code> zur Verkettung genutzt wird, der mit einer initialen L\u00e4nge von 16 Zeichen erstellt wird und dessen <code>toString()<\/code>-Methode dessen <code>char<\/code>-Array direkt \u00fcbernimmt.<\/p>\n\n\n\n<p>In Java 5 \u00e4ndert sich das Ergebnis der Verkettung des Substrings mit einem leeren String erneut:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">...\n\nsubstring appended to empty string:\n  string identity  : @1004901\n  string           : Code\n  value&#091;] identity : @1b90b39\n  value&#091;]          : &#091;C, o, d, e]\n  offset           : 0\n  count            : 4\n\n...<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><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>Ab Java 5 rufen <code style=\"background-color: rgb(255, 255, 255); color: initial;\">StringBuffer.toString()<\/code><span style=\"font-size: revert; color: initial;\"> und <\/span><code style=\"background-color: rgb(255, 255, 255); color: initial;\">StringBuilder.toString()<\/code><span style=\"font-size: revert; color: initial;\"> den oben gezeigten String-Constructor auf, der mit <\/span><code style=\"background-color: rgb(255, 255, 255); color: initial;\">Arrays.copyOfRange()<\/code><span style=\"font-size: revert; color: initial;\"> den tats\u00e4chlich ben\u00f6tigten Ausschnitt des <\/span><code style=\"background-color: rgb(255, 255, 255); color: initial;\">char<\/code><span style=\"font-size: revert; color: initial;\">-Arrays kopiert.<\/span><\/p>\n\n\n\n<p>In Java 7 und 8 sieht die Ausgabe dann so aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">original string:\n  string identity  : @26ffd553\n  string           : HappyCoders.eu\n  value&#091;] identity : @f74f6ef\n  value&#091;]          : &#091;H, a, p, p, y, C, o, d, e, r, s, ., e, u]\n\nsubstring:\n  string identity  : @47ffccd6\n  string           : Code\n  value&#091;] identity : @6ae11a87\n  value&#091;]          : &#091;C, o, d, e]\n\nsubstring appended to empty string:\n  string identity  : @6094cbe2\n  string           : Code\n  value&#091;] identity : @48d593f7\n  value&#091;]          : &#091;C, o, d, e]\n\nsubstring wrapped with new string:\n  string identity  : @3de5627c\n  string           : Code\n  value&#091;] identity : @6ae11a87\n  value&#091;]          : &#091;C, o, d, e]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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>Wie oben erl\u00e4utert, verweist der durch <code>String.substring()<\/code> zur\u00fcckgegebene Teilstring ab Java 7 auf ein separates <code>char<\/code>-Array. Au\u00dferdem gibt es die <code>offset<\/code>- und <code>count<\/code>-Felder nicht mehr.<\/p>\n\n\n\n<p>Die Workarounds durch Konkatenation oder Aufruf des String-Konstruktors sind also nicht mehr erforderlich. Auff\u00e4llig ist hier, dass die String-Verkettung einen neuen String mit neuem <code>char<\/code>-Array erstellt, w\u00e4hrend der String-Konstruktor das <code>char<\/code>-Array \u00fcbernimmt.<\/p>\n\n\n\n<p>Seit Java 9 enth\u00e4lt der String kein <code>char<\/code>-Array mehr, sondern ein <code>byte<\/code>-Array:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">original string:\n  string identity  : @4c203ea1\n  string           : HappyCoders.eu\n  value&#091;] identity : @71be98f5\n  value&#091;]          : &#091;72, 97, 112, 112, 121, 67, 111, 100, 101, 114, 115, 46, 101, 117]\n  coder            : 0\n\nsubstring:\n  string identity  : @96532d6\n  string           : Code\n  value&#091;] identity : @3796751b\n  value&#091;]          : &#091;67, 111, 100, 101]\n  coder            : 0\n\nsubstring appended to empty string:\n  string identity  : @3498ed\n  string           : Code\n  value&#091;] identity : @1a407d53\n  value&#091;]          : &#091;67, 111, 100, 101]\n  coder            : 0\n\nsubstring wrapped with new string:\n  string identity  : @3d8c7aca\n  string           : Code\n  value&#091;] identity : @3796751b\n  value&#091;]          : &#091;67, 111, 100, 101]\n  coder            : 0<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><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>Analog zur vorherigen Java-Version wird bei der String-Verkettung ein neues <code>byte<\/code>-Array angelegt, w\u00e4hrend der String-Konstruktor das bestehende <code>byte<\/code>-Array wiederverwendet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"fazit\">Fazit<\/h2>\n\n\n\n<p>DIeser Artikel hat gezeigt, wie man <code>String.substring()<\/code> einsetzt, wie die Methode intern arbeitet und wie sich die Funktionsweise im Laufe der Zeit ge\u00e4ndert hat.<\/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>Du m\u00f6chtest \u00fcber alle neue Java-Features auf dem Laufenden sein? 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>Javas String.substring()-Methode ist eine der am h\u00e4ufigsten verwendeten Java-Methoden \u00fcberhaupt.<\/p>\n<p>Wie setzt man die Methode ein? Wie funktioniert substring() intern, und wie hat sich die Implementierung im Laufe der Zeit ge\u00e4ndert?<\/p>\n","protected":false},"author":1,"featured_media":34473,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie setzt man die Methode String.substring() ein? Wie funktioniert substring() intern, und wie hat sich die Implementierung im Laufe der Zeit ge\u00e4ndert?","_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":16799,"_post_count":0,"footnotes":""},"categories":[64],"tags":[227,219],"class_list":["post-26864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-basics-de","tag-java-grundlagen"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/01\/java-substring-method.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":1,"uagb_excerpt":"Javas String.substring()-Methode ist eine der am h\u00e4ufigsten verwendeten Java-Methoden \u00fcberhaupt. Wie setzt man die Methode ein? Wie funktioniert substring() intern, und wie hat sich die Implementierung im Laufe der Zeit ge\u00e4ndert?","public_identification_id":"2d659494aec246bda4dca8daa47bf4cf","private_identification_id":"771dd4f13b94477fab1006df257ec158","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/26864","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=26864"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/26864\/revisions"}],"predecessor-version":[{"id":52440,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/26864\/revisions\/52440"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34473"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=26864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=26864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=26864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}