Keylearnings
- Was ist ein Java String?
- Wie du den Inhalt zweier Strings mit equals vergleichst.
- Wie du einen Teilstring mit Hilfe von substring extrahierst.
- Wie du einen String in einen primitiven Datentyp konvertierst.
- Wie du mit Hilfe von contains überprüfst, ob ein String einen bestimmten Teilstring enthält.
- Wie du mit Hilfe der Methode split einen String über einen Seperator zerlegst.
- Wie du in einem String mit der Methode replace Teilstrings austauschst.
- VIDEOANLEITUNG Implementierung in Eclipse
Mit JAVA Strings kannst du Geld verdienen! Das weiß ich aus erster Hand. Zum Beispiel im Bankensektor!
Moment Kim! Jetzt mal locker durch die Hose atmen. Was zum Geier ist ein Java String?
Ein Java String ist nichts weiter als eine Zeichenkette, wie du sie bereits unzählige Male gesehen hast.
Im berühmtesten Programm der Welt, hast du z.B. die Zeichenkette „Hallo Welt“ auf dem Bildschirm ausgegeben.
Warum ist das so wichtig?
Naja, auch wenn wir in einer multimedialen Welt mit Ton, Videos und 3D Kino leben, gehören Texte nach wie vor zu den wichtigsten Kommunikationsmitteln.
Denk nur mal daran, wenn du dir bei Amazon zum ersten Mal ein Buch bestellen möchtest. Das erste was du machen musst, ist ein Textformular ausfüllen, in dem du deinen Namen, deine Adresse und die Informationen für die Zahlungsabwicklung eintragen musst.
Und wie verarbeiten wir Texte?
Ganz genau! Mit Zeichenketten! Und Zeichenketten nennt man in der Programmierung eben Strings.
Apropo Zahlungsabwicklung.
Hast du dich auch schon über den langen IBAN (International Bank Account Number) Code geärgert, den sich kein Mensch merken kann, welchen du aber auf deinen Banküberweisungen immer eintragen musst?
Ich schon! Allerdings muss ich zugeben, dass es absolut Sinn macht. Denn wusstest du, dass in der IBAN Nummer allerhand nützlicher Informationen versteckt sind?
Hier ein kleines Beispiel (Quelle: Wikipedia):
DE 68 2105 0170 0012 3456 78
- An Stelle 1 bis 2 steht das Länderkürzel
- An Stelle 3 bis 4 steht die Prüfziffer
- An Stelle 5 bis 12 steht die Bankleitzahl
- An Stelle 13 bis 22 steht die Kontonummer
Die IBAN bietet uns also ideale Möglichkeiten um uns bei den Java Strings auszutoben.
Wie werden Zeichenketten verarbeitet?
Wie der Name schon sagt, ist eine Zeichenkette eine Aneinanderreihung von einzelnen Zeichen.
Der Java String. Ein Objekt oder ein Standarddatentyp?
Um ein einzelnes Zeichen zu speichern, gibt es den Datentyp char
. Daher ist es eine naheliegende Idee eine Zeichenkette als java array mit dem Datentyp char
aufzufassen.
Das ist auf jeden Fall möglich! Aber mach das Spaß? Nein!! Deshalb werden wir diese Möglichkeit auch nicht weiter verfolgen.
Wir verwenden gleich den Datentyp String
.
Üben wir das mal! Und deklarieren zwei String-Variablen, denen wir beiden den Wert „Franka Müller“ zuweisen.
String person1 = "Franka Müller"; String person2 = "Franka Müller";
Das sieht genauso aus, als würden wir einem üblichen Standarddatentyp wie Integer
, double
oder char
einen Wert zuweisen.
ABER ACHHTUNG!
Der Datentyp String ist KEIN Standarddatentyp, sondern ein Objekt.
Aber Kim, das String Objekt hätten wir dann doch mittels new erzeugen müssen!
Richtig! In der Tat! Wir hätten auch
String person1 = new String("Franka Müller"); String person2 = new String("Franka Müller");
schreiben können. Hier greift uns JAVA mit sogenannten String Literalen unter die Arme, sodass wir einen String initialisieren können als wäre es ein Standard-Datentyp.
Aber bereits bei einem String vergleich, fällt die objektorientierte Natur eines Strings auf.
Java Strings vergleichen
Rate mal was folgender Programmschnipsel für eine Ausgabe liefert.
if (person1 == person2){ System.out.println("Die Personen sind gleich!"); }else{ System.out.println("Die Personen sind verschieden!"); }
Die Variablen person1
und person2
haben beide den gleichen Wert Franka Müller
. Dennoch ist die Programmausgabe:
Die Personen sind verschieden!
Woran liegt’s? Ist die if-Abfrage kaputt?
Nein! Zum Glück nicht. Aber da ein String ein Objekt ist, enthalten die Variablen person1
und person2
lediglich Referenzen auf die Speicherstellen, an denen die Instanzen gespeichert sind.
Weil wir aber zwei Objekte erzeugt haben, und damit zwei voneinander unabhängige Speicherplätze reserviert haben, sind diese Referenzen verschieden.
Dass diese Objekte zufällig den gleichen Inhalt haben, spielt für den Vergleichsoperator ==
keine Rolle, denn der vergleicht nur die in den Variablen gespeicherten Referenzen und die sind eben unterschiedlich, weshalb die Bedingung in der if
Abfrage nicht erfüllt ist.
Um die Inhalte der String-Objekte auf Gleichheit zu überprüfen, gibt es die Objektmethode equals
. Diese Methode erwartet als Parameter den String, mit dem verglichen werden soll.
Bauen wir den Programmcode von oben entsprechend um.
1: if (person1.equals(person2)){ 2: System.out.println("Die Personen sind gleich!"); 3: }else{ 4: System.out.println("Die Personen sind verschieden!"); 5: }
Einzigtser Unterschied ist, dass wir in Zeile eins, anstatt des Vergleichsoperators ==
, die String-Objekt-Methode equals
verwenden und dadurch den Inhalt der Strings auf Gleichheit überprüfen.
Jetzt erhalten wir die gewünschte Programmausgabe:
Die Personen sind gleich!
Selbstverstädnlich ist es hierbei egal, ob wir die equals
Methode über die Variable person1
oder person2
aufrufen.
Du hättest also genauso gut person1.equals(person2)
schreiben können.
Kommen wir zurück zu unserem IBAN Code. Wir wollen im folgenden eine Klasse IBAN
entwickeln.
Dazu werden wir im ersten Schritt eine Funktion schreiben, die uns die Bestandteile des IBAN wie Kontonummer und Bankleitzahl zurückliefert. Hierbei übergeben wir die IBAN als Argument an diese Funktion.
Wir müssen also die Bestandteile des IBAN’s extrahieren. Hierfür besitzt das String Objekt die Methode substring
.
Java String substring
Die java String substring
Methode hat zwei Parameter. Der erste Parameter ist die Anfangsposition und der zweite Paramater die Endposition des zu extrahierenden Teilstrings.
Hierbei ist zu beachten, dass die Zählung bei der Anfangsposition bei Null anfängt, aber die Endposition „normal“ gezählt wird.
Beginnen wir mit dem Aufbau der Klasse IBAN
.
Hier erstmal der Programmcode. Eine detailierte Erklärung folgt.
1: class IBAN{ 2: private String strLandzeichen; 3: private String strPruefZiffer; 4: private String strBLZ; 5: private String strKontonummer; 6: IBAN(String pStrIBAN){ 7: extrahiereKennzeichen(pStrIBAN); 8: } 9: private void extrahiereKennzeichen(String pStrIBAN){ 10: strLandzeichen = pStrIBAN.substring(0,2); 11: strPruefZiffer = pStrIBAN.substring(2,4); 12: strBLZ = pStrIBAN.substring(4,12); 13: strKontonummer = pStrIBAN.substring(12,22); 14: } 15: }
Unsere IBAN
Klasse besitzt für jeden IBAN Bestandteil eine Instanzvariable (Zeile 2 bis 5).
Der Methode extrahiereKennzeichen
(Zeile 9 bis 14) übergeben wir den IBAN als Parameter.
Innerhalb der Methode werden die Kennzeichen, Länderkürzel, Prüfziffer, Bankleitzahl und Kontonummer nacheinander mit Hilfe der substring
Methode extrahiert und den entsprechenden Objektvariablen zugewiesen.
So wird beispielsweise in Zeile zwölf die achtstellige Bankleitzahl, die an Position fünf im IBAN Code beginnt extrahiert. Und immer schön dran denken, das erste Argument von substring
ist vier, da wir bei Null anfangen zu zählen.
Ansonsten hat die Klasse noch einen Konstruktor mit einem String Parameter, der aber nichts weiter macht als unsere Methode extrahiereKennzeichen
aufzurufen.
Um das alles vernünftig testen zu können, fügen wir noch eine Methode ausgabeKennzeichen()
hinzu.
public void ausgabeKennzeichen(){ System.out.println("Land: "+strLandzeichen); System.out.println("Prüfziffer: "+strPruefZiffer); System.out.println("Bankleitzahl: "+strBLZ); System.out.println("Kontonummer: "+strKontonummer); }
Ich merke schon, du wirst langsam ganz hibbelig. Deshalb hier der Testlauf!
1: IBAN meineIBAN = new IBAN("DE68210501700012345678"); 2: meineIBAN.ausgabeKennzeichen();
In Zeile eins erzeugen wir mit Hilfe des Schlüsselwortes new
eine neue IBAN
Instanz. Hierbei übergeben wir dem Konstruktor den Beispiel IBAN „DE68210501700012345678“.
Zeile zwei ruft dann die Objektmethode ausgabeKennzeichen()
auf, die sämtliche Objektvariablen des IBAN
Objekt auf dem Bildschirm ausgibt.
Hier die Programmausgabe:
Land: DE Prüfziffer: 68 Bankleitzahl: 21050170 Kontonummer: 0012345678
Jippieh, genau das haben wir erwartet.
Java String Typkonvertierungen
Kim! Wir haben die Prüfziffer als String extrahiert. Aber sollte das nicht eigentlich ein Integer sein?
Sehr gut aufgepasst!
Um die Prüfziffer zu validieren, müssen wir damit rechnen können und das geht natürlich nur, wenn wir diese in einem numerischen Datentyp speichern.
Weil es sich hierbei um eine Ganzzahl handelt, bietet sich der Datentyp Integer
an.
Um einen String in einen Integer
Wert zu konvertieren, gibt es in der Klasse Integer
die Klassenmethode parseInt
, welche als Parameter den zu konvertierenden String erwartet.
Die Prüfziffer unserer IBAN lässt sich also wie folgt in einen Integer
Wert umwandeln.
intPruefziffer = Integer.parseInt(strPruefZiffer);
Natürlich gibt es analoge Funktionen auch für die Datentypen, double
, float
und short
. Diese heißen dann parseDouble
, parseFloat
und parseShort
.
Kim, was passiert wenn wir einen Wert übergeben, der nicht in eine Zahl konvertiert werden kann?
Exzellente Frage!
Rufen wir die Funktion parseInt
testweise mit dem String „Karsten“ als Parameter auf.
intPruefziffer = Integer.parseInt("Karsten");
In diesem Fall wird eine sogenannte NumberFormatException
ausgelöst. Eine Exception ermöglicht die Fehlerbehandlung während der Programmlaufzeit. Aber das ist ein Thema, dem wir uns noch gesondert widmen werden.
Im Augenblick ist nur wichtig zu verstehen, dass das nicht zu einem Kompilierungs-Fehler führt.
Java String contains
Häufig sind wir in der Situation, dass wir überprüfen müssen, ob ein String einen bestimmten Teilstring enthält.
So kann es uns zum Beispiel interessieren, ob ein IBAN eine bestimmte Bankleitzahl enthält. Auf diese Weise können wir dann feststellen, ob ein IBAN zu einem Konto der Commerzbank, der Sparkasse oder der Raifeisenbank gehört.
Und genau hierfür gibt es die Java String contains
Methode.
Schauen wir uns am besten gleich ein Beispiel an!
Wir wollen testen, ob eine IBAN die Bankleitzahl einer Commerzbank Filiale in Mönchengladbach enthält.
Hierzu müssen wir überprüfen, ob eine IBAN den Teilstring 31040015 (die BLZ der entsprechenden Filiale) hat.
Für diesen Zweck gibt es die Java String contains
Objektmethode, welche als Parameter den zu überprüfenden Teilstring erwartet.
Die Methode liefert den Wahrheitswert true
, falls der entsprechende Teilstring gefunden wurde und false
im Falle, dass der zu überprüfende String den zu suchenden Teilstring nicht enthält.
Klingt in der Theorie wieder schrecklich kompliziert! Deshalb auf in die Praxis!!
Wir fügen unserer IBAN
Klasse eine Methode blzEnthalten
hinzu, der wir die zu überprüfende Bankleitzahl als String
Argument übergeben können.
1: public void blzEnthalten(String pStrBankleitzahl){ 2: if (strIBAN.contains(pStrBankleitzahl)){ 3: System.out.println("BLZ gefunden!"); 4: }else{ 5: System.out.println("BLZ nicht gefunden!"); 6: } 7:}
Was macht diese Methode?
In Zeile zwei wird die Methode contains
des String-Objekts aufgerufen, das den IBAN Code enthält, in dem wir nach der Bankleitzahl suchen möchten, die wir über den String Parameter pStrBankleitzahl
an die Methode übergeben haben.
Enthält strIBAN
die Bankleitzahl aus dem Funktionsparameter pStrBankleitzahl
, dann liefert die contains
Methode den Wert true
, weshalb die if-Bedingung
erfüllt ist und daher in Zeile drei die Bildschirmausgabe
BLZ gefunden!
erzeugt wird.
Andernfalls ist der Rückgabewert von contains
false
und welch eine Überraschung die Bildschirmausgabe in Zeile fünf wird ausgegeben.
Okay, machen wir eine Probefahrt!
1: IBAN meineIBAN = new IBAN("DE68210501700012345678"); 2: IBAN meineIBAN2 = new IBAN("DE68310400150012345678"); 3: meineIBAN.blzEnthalten("31040015"); 4: meineIBAN2.blzEnthalten("31040015");
In den ersten beiden Zeilen erzeugen wir zwei IBAN
Objekte um für jedes Objekt die Methode blzEnthalten
mit dem Argument „31040015“ aufzurufen.
Da nur das Objekt meineIBAN2
diesen Teilstring enthält, ist die Programmausgabe:
BLZ nicht gefunden! BLZ gefunden!
Java String split
Bei unserem IBAN haben wir es einfach, da wir genau wissen an welchen Positionen die einzelnen Bestandteile stehen.
Häufig genießen wir diesen Luxus aber nicht!
Auf der Überweisung einer Bank steht z.B. der Name des Kontoinhabers.
Möchten wir diesen nach Vor- und Nachnamen trennen, hilft uns die substring
Methode nicht weiter, da unterschiedliche Vor- bzw. Nachnamen in der Regel auch unterschiedlich lang sind.
Deshalb haben wir in diesem Fall nicht die Möglichkeit die Namensbestandteile mittels Positionsangaben zu extrahieren.
Hier müssen wir mit sogenannten Seperatoren arbeiten.
Ein Seperator ist ein String, der zwischen den einzelnen Zeichenketten-Bestandteilen steht.
Bei einem Namen ist das Leerzeichen ein sinnvoller Seperator.
Franka_Müller
Zu Demonstrationszwecken werden wir aber die Zeichenkette TRENNER als Seperator verwenden. Also
Franka TRENNER Müller.
Aber wir haben großes Glück, denn auch hierfür gibt es in Java eine Lösung. Nämlich die Java String split
Methode.
Auch die split
Objektmethode gehört zu der String
Klasse. Als Parameter wird der Seperator erwartet.
Die Rückgabe der split
Methode ist ein Java array, das die einzelnen Zeichenketten-Bestandteile als Elemente enthält.
Schauen wir uns auch das in der Praxis an.
Um den Schwierigkeitsgrad ein bisschen zu erhöhen, betrachten wir den Fall, dass eine Person mehr als ein Vorname hat. Also z.B.
Franka TRENNER Tanja TRENNER Frederike TRENNER Müller.
1: String strName = "Franka TRENNER Tanja TRENNER Frederike TRENNER Müller"; 2: String[] strNamenArray = strName.split("TRENNER"); 3: for(int i = 0;i<(strNamenArray.length - 1);i++){ 4: System.out.println("Vorname "+i+": "+strNamenArray[i]); 5: } 6: System.out.println("Name: "+strNamenArray[strNamenArray.length-1]);
Die erste Zeile ist einfach! Hier weisen wir lediglich unsere Namenszeichenkette, einschließlich dem Seperator TRENNER, der String Variablen strName
zu.
Das worauf es uns ankommt passiert in Zeile zwei, in der wir die split
Methode über die Objektvariable strName
mit dem Seperator als Argument aufrufen, wodurch wir ein Java array mit den Elementen
strNamenArray[0] = Franka
strNamenArray[1] = Tanja
strNamenArray[2] = Frederike
strNamenArray[3] = Müller
erhalten.
Offensichtlich steht der Nachname im letzten Element des Arrays.
Deshalb geben wir alle Vornamen mittels einer for Schleife aus indem wir das Array bis zum vorletzten Element durchlaufen.
Die Stelle des vorletzten Elements bekommen wir heraus indem wir die java Array length Eigenschaft abfragen und um Eins verringern.
In Zeile sechs geben wir dann noch den Nachnamen auf dem Bildschirm aus, der sich im letzten Array Element befindet, über das wir auch hier wieder über die java Array length Eigenschaft zugreifen.
Die Subtraktion um eins ist nötig, da das erste Element des Arrays den Wert 0 hat.
Okay, hier die vollständige Programmausgabe!
Vorname 0: Franka Vorname 1: Tanja Vorname 2: Frederike Name: Müller
Java String replace
Last but not least! Wollen wir uns noch ein weiteres Feature der Zeichenketten-Verarbeitung unter Java anschauen. Nämlich das Ersetzen von einem String durch einen anderen.
Du brauchst ein Beispiel?
Stell dir einen Serienbrief vor!
Worin unterscheiden sich zwei Briefe in einer Serie?
Ganz genau! Durch den Namen in der Anrede!!
Jeder Brief der Serie hat einen Platzhalter, der durch den Namen des Empfängers ausgetauscht werden muss.
Und genau das kannst du mit der Java string replace
Methode bewerkstelligen.
Als Platzhalter verwenden wir in unserem Beispiel drei Unterstriche. Also beispielsweise:
String strAnrede = "Sehr geehrte ___";
Dort wo der Platzhalter steht, wollen wir „Frau Franka Müller“ einfügen.
Hierzu rufen wir die Objektmethode replace
des Stringobjekts auf.
Die replace
Methode hat zwei Parameter. Der erste Parameter ist der String, der ersetzt werden soll (bei uns „___“) und der zweite Parameter ist der einzusetzende String (bei uns „Frau Franka Müller“).
Der Rückgabewert von replace
ist ein NEUES String-Objekt.
Und hier lauert eine böse Falle! Strings sind unveränderlich! Deshalb führt folgender Programmcode NICHT zum gewünschten Ergebnis.
strAnrede.replace("___", "Frau Franka Müller");
Sieht plausibel aus und geht wie ein geölter Blitz durch den Compiler.
Wenn wir aber den String strAnrede
ausgeben, erhalten wir
Sehr geehrte ___
Es scheint so, als wäre nichts passiert.
Aber das stimmt nicht! Da der String strAnrede
unveränderbar ist, liefert die replace
Methode eine neue Zeichenkette zurück, in der „___“ durch „Frau Franka Müller“ ersetzt ist.
Leider haben wir den nirgends gespeichert. Holen wir das also nach!
String strAnrede = "Sehr geehrte ___"; String s = strAnrede.replace("___", "Frau Franka Müller"); System.out.println(s);
Jetzt haben wir daran gedacht, den von der replace
Methode zurück gelieferten String
in der Variablen s
zu speichern.
Und schon erhalten wir die gewünschte Programmausgabe.
Sehr geehrte Frau Franka Müller
Super! Wir haben es geschafft!
Ich hoffe ich konnte dir in diesem Artikel die Zeichenkettenverarbeitung durch Java Strings ein wenig näher bringen.
Im folgenden Video zeige ich dir, wie du die beschriebenen Schritte in Eclipse umsetzt.
Wie immer freue ich mich über deine Fragen im Kommentarbereich!
Hat dir der Artikel gefallen? Dann folge uns doch am besten gleich auf Facebook!
Katharina
19. Februar 2017 at 12:57Das ist sehr verständlich geschrieben und hat mir sehr weiter geholfen. Danke!
Kim Peter
19. Februar 2017 at 15:16Super! Danke für deine Rückmeldung. Viele Grüße Kim
Marc
14. Januar 2018 at 9:42Hilft mit als Java-Anfänger gut weiter. Bei der Umwandlung vom String in einen Integer frage ich mich allerdings wo dies implementiert werden soll, da bei mir an sämtlichen Stellen Exceptions ausgelöst werden.
Kim Peter
17. Januar 2018 at 12:16Hallo Marc, um einen String in einen Integer zu verwandeln kannst du Methoden aus der Klasse Integer verwenden. Beispiel: Integer.parseInt(myString) Viele Grüße Kim
Marvin
20. März 2019 at 11:17Der Anfang ist ein bisschen missverständlich geschrieben. Wenn ich die beiden Stringvariablen mittels
String person1 = „Max Mustermann“;
String person2 = „Max Mustermann“;
deklariere, dann ergibt
person1 == person2 wirklich den Wert true. Wenn ich die beiden Variablen allerdings über
String person1 = new String („Max Mustermann“);
String person2 = new String („Max Mustermann“);
deklariere, dann ergibt
person1 == person2 den Wert false.
Kim Peter
20. März 2019 at 11:57Hallo Marvin, sehr gute Beobachtung! Dieses Verhalten ist leider etwas komplizierter zu erklären. Es hat damit zu tun wie Java intern mit Strings umgeht. Hierfür wird ein sogenannter String Pool verwendet und ich bin der Meinung, um diesen zu erklären muss man sich zunächst damit beschäftigen wie der Speicher organisiert (Stack, Heap etc) und ich bin der Meinung, dass das für diesen Artikel etwas zu weit geht. In der Praxis wird man auf dieses Problem nur in Ausnahmenfällen stoßen, da wenn man Strings vergleicht ja nicht wissen will, ob diese auf der gleichen Speicheradresse liegen sondern den Inhalt vergleichen möchte. Anstatt s1 == s2 verwendet man also in der regel s1.equals(s2). Viele Grüße Kim
Jasmin
16. April 2020 at 17:59Hallo Kim! Danke für deine tollen Erklärungen! Ich bin Anfänger und dank dir, da weiterhin am Ball. Du erklärst es echt gut für Anfänger 🙂 bitte mach weiter so!!
Kim Peter
18. April 2020 at 18:58Hallo Jasmin, freue mich, wenn ich helfen kann. Viele Grüße Kim
Choose a style: