Javaschubla.de - Java als erste Programmiersprache

Strings in Java

Schon im Hallo-Welt-Programm hatten wir erste Kontakte mit Strings, jetzt wollen wir sie intensiver betrachten.

Strings sind Zeichenketten. Sie sind in Java kein primitiver Datentyp, sondern Objekte. Was es genau bedeutet, dass etwas ein Objekt ist, wird erst in einer späteren Lektion klar werden.

String ist eine Klasse im Package java.lang. Dieses wird automatisch importiert, deshalb braucht man nicht java.lang.String auszuschreiben.

Variablen, die einen nicht-primitiven Typ haben, werden genau so deklariert wie bei primitiven Typen:

    String s;

(Man könnte auch java.lang.String s schreiben.)

Um Stringliterale setzt man Anführungszeichen (Shift+2 auf einer deutschen Tastatur).

"abc"

Auch die Zuweisung funktioniert wie bei den primitiven Typen:

    s = "abc";

Und natürlich kann man das auch wieder zu einer Zeile zusammenfassen:

    String s = "abc";

Neue Objekte erzeugt man mit new.

Typ variablenName = new Typ(parameter1, parameter2, ...);

Für Strings also:

    String s = new String("abc");

Es ist aber besser s = "abc" statt s = new String("abc") zu verwenden. Ich werde später erklären, warum das so ist.

Jetzt brauchen wir aber doch ausnahmsweise mal die Möglichkeit mit new.

    String s1 = new String("abc");
    String s2 = new String("abc");

Beide String-Objekte sind gleich, sie haben den gleichen Wert (nämlich "abc"). Aber es ist nicht dasselbe Objekt!

Den Inhalt oder Wert zweier Objekte kann man nicht vergleichen wie primitive Variablen, also nicht mit ==. In den Variablen s1 und s2 ist nur eine Referenz (Pointer, Zeiger) auf das eigentliche Objekt gespeichert. Also in s1 und s2 steht jeweils die Adresse des Objekts im Arbeitsspeicher. An der Adresse liegt dann der eigentliche String. Also liegt an zwei verschiedenen Stellen im Arbeitsspeicher der String "abc" - die Adressen in s1 und s2 sind unterschiedlich.

    if (s1 == s2)
    {
      System.out.println("gleiche Adresse");
    }
    else
    {
      System.out.println("verschiedene Adressen");
    }

gibt also verschiedene Adressen aus.

Wie können wir herausfinden, dass die Objekte gleich sind? Mit der Methode (Funktion) equals.

    if ( s1.equals(s2) )
    {
      System.out.println("gleicher Inhalt");
    }
    else
    {
      System.out.println("anderer Inhalt");
    }

Die Methode equals ist in der Klasse String definiert. Sie erwartet einen Parameter. Sie gibt true oder false zurück, also einen boolean (Wahrheitswert).

Eine (nicht-statische) Methode ruft man so auf: Variablenname.Methodenname(Parameter); Zwischen Variablenname und Methodenname steht also der Punktoperator. Um den oder die Parameter kommen runde Klammern. Mehrere würden mit Kommas getrennt werden. Hier ist der Variablenname s1, der Methodenname equals und der Parameter s2. (Man hätte an dieser Stelle natürlich genau so gut s2.equals(s1) verwenden können.)

Man kann es auch so ausdrücken: An das Objekt s1 wird die Nachricht "equals" geschickt, ihm wird also gesagt, es soll einen Vergleich ausführen, seine equals-Methode aufrufen. Als Parameter wird s2 übergeben.

equalsIgnoreCase vergleicht ohne Rücksicht auf Groß- und Kleinschreibung.

Zwei weitere interessante Methoden in der Klasse String sind length und charAt.

Wie man sich denken kann, bestimmt length die Länge.

    String s = "abcdef";
    int i = s.length();
    System.out.println(i);

gibt selbstverständlich 6 aus.

Achte darauf, auch dann die runden Klammern hinter einen Methodenaufruf zu schreiben, wenn gar kein Parameter übergeben wird. Das ist zwingend notwendig, um sie von Variablen zu unterscheiden.

charAt(n) gibt das n-te Zeichen aus, man beginnt aber bei 0 mit Zählen.

    String s = "abcdef";
    char c = s.charAt(2);
    System.out.println(c);

gibt also c aus, nicht etwa b!

Die Zeichen sind also von 0 bis length-1 durchnummeriert.

Auch Stringliterale wie "abc" sind Objekte, man kann also auch alle Methoden auf ihnen aufrufen, z.B. "abc".charAt(0) ist 'a', "abc".length() ist 3 und "abc".equals(s1) ergibt true oder false.


Übung 1

Probier die hier vorgestellten Methoden der Klasse String, also equals, equalsIgnoreCase, length und charAt aus.

Übung 2

Ruf die API-Dokumentation auf, wähle links oben das Package java.lang und links unten die Klasse String aus. Scroll zur "Method Summary" und schau dir an, was String noch für Methoden hat. Einige werden relativ unverständlich sein, aber viele sind leicht zu verstehen. Klick auf einen Methodennamen um weiter nach unten zur ausführlichen Beschreibung zu kommen. Probier ein paar Methoden aus. Einfache Methoden sind:

    System.out.println( "abc".replace('a', 'z') );
    System.out.println( "abcdef".startsWith("abc") );
    System.out.println( "abcdef".endsWith("def") );
    System.out.println( "Hallo Welt".toLowerCase() );
    System.out.println( "Hallo Welt".toUpperCase() );
    System.out.println( "Hallo Welt".substring(2, 5) );
    System.out.println( "Hallo Welt".indexOf('l') );
    System.out.println( "Hallo Welt".indexOf('l', 5) );
    System.out.println( "Hallo Welt".indexOf('Wel') );
    System.out.println( "       Hallo   Welt    ".trim());
    System.out.println( "abc".compareTo("def"));
    System.out.println( "def".compareTo("abc"));
    System.out.println( "abc".compareTo("abc"));

"Lower Case" heißt "in Kleinbuchstaben", "Upper Case" heißt "in Großbuchstaben".


In der nächsten Lektion werden Schleifen (Wiederholungen) eingeführt.