JAVA String – Wie du in deinen Programmen Zeichenketten verarbeitest.

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.

Was ist ein java String

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

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

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!

Hallo ich bin Kim und ich möchte ein großer Programmierer werden. Machst du mit?

Kommentare (8)

  • Antworte

    Das ist sehr verständlich geschrieben und hat mir sehr weiter geholfen. Danke!

    • Super! Danke für deine Rückmeldung. Viele Grüße Kim

  • Antworte

    Hilft 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.

    • Hallo 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

  • Antworte

    Der 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.

    • Hallo 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

  • Antworte

    Hallo 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!!

    • Hallo Jasmin, freue mich, wenn ich helfen kann. Viele Grüße Kim

Antworte auf Marvin Abbruch