Java String
Willemers Informatik-Ecke
Methoden Geltungsbereich von Variablen

String name = "James";
Der Speicherplatz eines Strings kann unterschiedlich groß sein. Eine String-Variable enthält nicht direkt die Zeichenkette, sondern ist eine Referenz, also ein Verweis auf ein Objekt, das die Zeichenkette enthält. Wie bei Referenzen üblich, kann auch eine String-Variable mit null besetzt sein. Das bedeutet, dass die Referenz auf keinen String zeigt.

Eine Zuweisung funktioniert auf die gleiche Weise wie bei einer primitiven Variablen.

String-Methoden

Mit Methode zur Länge

Die Bearbeitung von Strings erfolgt über Methoden, die über die Stringvariable aufgerufen werden. Auf die Variable folgt ein Punkt und dann der Name der Methode.

Methoden sind Funktionen, die auf Objekte einwirken. In diesem Fall wirkt also die Methode auf den String ein. Anders ausgedrückt, ist der String, über den die Methode aufgerufen wird, gleichzeitig ihr erster Parameter.

Als Beispiel ermittelt die Methode length die Länge eines Strings.

String gruss = "Hallo Süderbrarup!";
int laenge = gruss.length();
Vorsicht: Dummerweise ist length bei Strings eine Methode, also gefolgt von einem Klammerpärchen, bei Arrays dagegen eine Variable ohne Klammern.

Zugriff auf die Buchstaben des Strings

Um die einzelnen Buchstaben aus dem String zu holen, gibt es die Methode charAt, die das Zeichen an Stelle pos liefert.
String gruss = "Hallo Süderbrarup!";
int pos = 6; // 7te Stelle, da Position bei 0 beginnt
char zeichen = gruss.charAt(pos); // zeichen == 'S'
Einen Zugriff über rechteckige Klammern wie in Arrays gibt es nicht. Ein einzelnes Zeichen eines Strings kann nicht geändert werden.

Verkettung von Strings

Um zwei Strings aneinander zu hängen, kann die Methode concat aufgerufen werden.
String bond = "Bond";
bond = bond.concat(", James Bond");
Alternativ kann auch der Operator + verwendet werden.
String bond = "Bond";
bond = bond + ", James Bond";

Weitere Methoden

Sie können mit der Methode contains prüfen, ob ein String einen anderen String enthält. Der Rückgabetyp ist boolean.
if (bond.contains("am")) {
Sie können einen Teilstring in einem String mit der Methode indexOf ermitteln. Sie ermittelt die Position, an der der Suchstring im String vorliegt oder -1, wenn er nicht vorkommt.
int pos = str.indexOf(“me“);
In einer Überladung können Sie als zweiten Parameter die Position angeben, ab der gesucht werden soll. Damit ist es möglich nacheinander alle Positionen im String zu finden.
pos = str.indexOf(“me“, pos+1);
Beispielsweise wird die folgende Schleife die Positionen zurückgeben, an der der String die Zeichenkette on enthält.
String bond = "Bond, James Bond";
int pos = 0;
do {
    pos = bond.indexOf("on", pos);
    if (pos >= 0) {
        System.out.println(pos++);
    }
} while (pos >= 0);
Die Methode substringliefert einen Teilstring zurück. Dazu werden Start- und Endposition des Teilstrings als Parameter übergeben.
String bond = "Bond, James Bond";
String sub = str.substring(1, 3); // "on"
Gibt es keinen zweiten Parameter, wird substring den gesamten Rest des String bis seinem Ende übergeben.

Vergleichen von Strings

Für das Vergleichen von Strings ist die Verwendung von == problematisch, weil String-Variablen ja Referenzen sind. Es wird bei == nur verglichen, ob die beiden Variablen auf dieselbe Speicheradresse verweisen, nicht, ob die Inhalte gleich sind. Aufgrund des sehr leistungsfähigen Optimierer im Java-Laufzeitsystem funktioniert eine ==-Abfrage erstaunlich oft.
String a = "Hallo";
String b = "Hallo";
System.out.println(a==b); // Ergibt true!
Diese Cleverness hat ihre Grenzen, sobald der String-Inhalt irgendwie berechnet wird. Beispielsweise durch Anhängen einer leeren Zeichenkette.
String c = a + "";
System.out.println(a==c); // Ergibt false!
Ein Vergleich zwischen Strings per == oder != ist riskant. Sinnvollerweise sollte man daher die Methode equals verwenden.
if (a.equals(c)) { // Das funktioniert immer bei gleichem Inhalt.

Immutable: Unveränderliche Strings

String-Variablen sind immutable. Das bedeutet, dass Inhalte einer String-Variablen nicht verändert werden können. Sie können also nicht so einfach das zweite Zeichen des Strings ändern, wie das bei Arrays noch funktionieren würde.

Diese Lästigkeit hat bei Methodenaufrufen aber ihre Vorteile. Ein übergebener String kann innerhalb der Methode nicht einfach geändert werden.

static void aendere(String s) {
    s = s + ", James Bond";
}
// ...
String bond = "Bond";
aendere(bond);
System.out.println(bond); // ergibt: Bond
Soll also der String von der Methode tatsächlich verändert werden, muss sie ihn per return wieder zurückgeben. Dazu muss beim Aufruf das Ergebnis wieder einer Stringvariablen zugewiesen werden und die Änderung wird auch für den flüchtigen Leser deutlich.
static String aendere(String s) {
    return s + ", James Bond";
}
// ...
String bond = "Bond";
bond = aendere(bond);
System.out.println(bond); // ergibt: Bond, James Bond
Wirkt eine Methode verändernd auf den String-Inhalt, wird der alte Inhalt verworfen und die Variable erhält per Rückgabewert einen komplett neuen Inhalt.

Der alte Inhalt bleibt als unreferenzierter Speicherabfall zurück und wird durch die niedrig-priorisierte Garbage Collection (wörtlich: Müllabfuhr) bei Gelegenheit eingesammelt.

Die positive Konsequenz ist, dass ein String bei Übergabe an eine Methode per Parameter nicht innerhalb der Methode verändert werden.

Benutzereingaben

Sie können auf Kommandozeilenebene den Scanner benutzen. Über die Methode next liefert dieser die nächste Zeichenkette. Lästig ist, dass der Scanner das Zeilenende, aber auch Leerzeichen als Trennzeichen interpretiert. Da Zeichenketten häufig Leerzeichen enthalten, ist die Eingabe einer kompletten Zeile mit nextLine sinnvoller. Leider gibt es dann aber Hakeleien, wenn auch nextInt oder nextDouble verwendet werden.
java.util.Scanner eingabe = new java.util.Scanner(System.in);
String str = eingabe.nextLine();
Wollen Sie Ihre Konsolenanwendung etwas aufhübschen, können Sie den Eingabedialog von Swing verwenden.
String str = javax.swing.JOptionPane.showInputDialog("Wie heißen Sie?");
System.out.println(str);

Strings auswerten und umwandeln

Beide Eingabemethoden liefern einen String. Das ist bei den meisten grafischen Oberflächen auch so. Wie wandeln Sie also eine Zahleneingabe in eine Zahl um? Man kann sehr leicht aus einer Zahl einen String machen. Dadurch wird die Zahl einfach mit einem Pluszeichen an einen leeren String gehängt.
String str = "" + wert; // 15.4 wird "15.4"

Literale

String-Literale werden in Anführungszeichen eingeschlossen. Will man Anführungszeichen im Literal einbinden, stellt man einen Backslash davor:
String dialog = “Er: \“Ich mag Dich.\“ Sie: \“Du mich auch.\““;
Der Backspace leitet Sonderzeichen ein:

\“ Anführungszeichen im Text
\‘ Hochkomma im Text
\t Tabulator
\n Neue Zeile
\\ Ein Backslash-Zeichen
\65 Ein Zeichen A (nach ASCII)

Die Codierung von Sonderzeichen wie etwa \168 wird nicht empfohlen, da dies die Codierung festlegt. Je nach Computertyp kann diese wechseln.

Allerdings ist es problemlos, wenn UNICODE verwendet wird. Internationale Sonderzeichen werden in Java als 16-Bit UNICODE gespeichert. Für die Darstellung und Eingabe wird zwischen dem Zeichensatz des Rechners automatisch konvertiert.

Um ein Unicode-Zeichen in einen String zu setzen, verwenden Sie einen Backslash, gefolgt von einem u und dem Zahlencode.

"Gr\u00FC\u00DFe"  // Grüße

Beispiele

Das folgende Programm ermittelt die Quersumme aller Ziffern im String.
String str = "1234";
int summe = 0;
for (int i=0; i<str.length(); i++) {
	summe += str.charAt(i) - '0';
}
System.out.println(summe);
Das nächste Programm wandelt den String in die analoge int-Variable um.
String str = "1234";
int summe = 0;
for (int i=0; i<str.length(); i++) {
	summe *= 10;
	summe += str.charAt(i) - '0';
}
System.out.println(summe);

Video


Methoden Geltungsbereich von Variablen