1. Vergleich von Referenzen und Inhalt
In Java sind Strings Objekte — keine Primitive. Wenn Sie die Variablen a und b schreiben, können sie auf dieselbe Zeichenfolge im String-Pool verweisen. c, das über den Konstruktor erstellt wurde, ist hingegen bereits ein anderes Objekt. Der Operator == vergleicht die Referenzen, nicht den Text.
String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b); // true (höchstwahrscheinlich internierter String)
System.out.println(a == c); // false (verschiedene Objekte)
Demonstration eines Fehlers
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); // false
Obwohl die Strings gleich aussehen, sind es unterschiedliche Objekte im Speicher.
2. equals(): Vergleich des String-Inhalts
Um den Inhalt zu vergleichen, verwenden Sie die Methode equals() — sie vergleicht Zeichenketten zeichenweise (unter Berücksichtigung der Groß-/Kleinschreibung).
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true
Beispiel: Passwortvergleich
String inputPassword = "Secret123";
String realPassword = "Secret123";
if (inputPassword.equals(realPassword))
{
System.out.println("Zugriff erlaubt!");
}
else
{
System.out.println("Falsches Passwort.");
}
Wichtig!
Wenn mindestens ein Objekt null ist, führt der Aufruf von equals() zu einer NullPointerException. Sicheres Muster:
if ("etwas".equals(someString)) { ... }
3. equalsIgnoreCase(): Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung
Wenn die Groß-/Kleinschreibung ignoriert werden soll (z. B. bei Benutzereingaben), verwenden Sie equalsIgnoreCase().
String name1 = "Ivan";
String name2 = "ivan";
System.out.println(name1.equalsIgnoreCase(name2)); // true
Beispiel: Vergleich von E-Mail-Adressen
String email1 = "User@Example.com";
String email2 = "user@example.com";
if (email1.equalsIgnoreCase(email2))
{
System.out.println("E-Mail-Adressen stimmen überein!");
}
Kurz: equals vs equalsIgnoreCase
| Methode | Beachtet Groß-/Kleinschreibung? | Beispiel „Java“ vs „java“ |
|---|---|---|
|
Ja | |
|
Nein | |
4. compareTo(): lexikografischer Stringvergleich
Die Methode compareTo() führt einen lexikografischen Vergleich (wie im Wörterbuch) durch. Sie gibt eine negative Zahl zurück, wenn der erste String „kleiner“ ist, 0 — gleich, und eine positive, wenn er „größer“ ist.
System.out.println("apple".compareTo("banana")); // < 0
System.out.println("apple".compareTo("apple")); // 0
System.out.println("banana".compareTo("apple")); // > 0
a.compareTo(b) →
< 0 — wenn a vor b kommt
0 — wenn sie gleich sind
> 0 — wenn a nach b kommt
compareTo()
Wie funktioniert das?
- Der Vergleich erfolgt von links nach rechts anhand der Unicode-Codes der Zeichen.
- Bei der ersten Abweichung wird die Differenz der Zeichencodes zurückgegeben.
- Wenn eine Zeichenkette ein Präfix der anderen ist, ist die kürzere „kleiner“.
System.out.println("cat".compareTo("catalog")); // < 0 ("cat" ist kürzer)
System.out.println("catalog".compareTo("cat")); // > 0
Beispiel: Sortieren eines String-Arrays
String[] fruits = {"banana", "apple", "pear"};
Arrays.sort(fruits); // verwendet intern compareTo()
System.out.println(Arrays.toString(fruits)); // [apple, banana, pear]
compareToIgnoreCase()
System.out.println("Java".compareToIgnoreCase("java")); // 0
5. Die Methoden startsWith() und endsWith()
Die Methoden startsWith() und endsWith() prüfen den Anfang bzw. das Ende eines Strings und liefern true/false zurück.
String fileName = "document.pdf";
String url = "https://www.google.com";
System.out.println(fileName.startsWith("doc")); // true
System.out.println(fileName.endsWith(".txt")); // false
System.out.println(url.startsWith("https://")); // true
Wozu das gut ist: Validierung von Formaten (Dateinamen, URLs) und Filtern nach Präfixen/Suffixen (z. B. alle ".jpg").
6. Methode contains(): Teilstring suchen
contains(CharSequence s) — eine einfache Möglichkeit, das Vorhandensein eines Teilstrings zu prüfen. Groß-/Kleinschreibung wird beachtet.
String text = "Willkommen in der Welt von Java!";
System.out.println(text.contains("Welt")); // true
System.out.println(text.contains("C++")); // false
Um die Groß-/Kleinschreibung zu ignorieren, bringen Sie beide Strings in denselben Fall: toLowerCase()/toUpperCase().
7. Die Methoden toLowerCase() und toUpperCase()
Geben einen neuen String zurück, der in Klein- bzw. Großschreibung umgewandelt wurde. Nützlich für vergleiche ohne Beachtung der Groß-/Kleinschreibung und fürs Formatieren.
String title = "Java Programming";
String lower = title.toLowerCase();
String upper = title.toUpperCase();
System.out.println(lower); // java programming
System.out.println(upper); // JAVA PROGRAMMING
8. Methode split(): String in Teile zerlegen
split(String regex) teilt den String anhand eines Trenners (regulärer Ausdruck) und gibt ein Array vom Typ String[] zurück.
Beispiel 1: nach Kommas
String names = "Alex,Maria,Ivan,Elena";
String[] nameArray = names.split(",");
for (String name : nameArray)
{
System.out.println(name.trim()); // trim() entfernt mögliche Leerzeichen
}
// Ausgabe:
// Alex
// Maria
// Ivan
// Elena
Beispiel 2: nach Leerzeichen
String sentence = "Ich lerne Java";
String[] words = sentence.split(" ");
for (String word : words)
{
System.out.println(word);
}
// Ausgabe:
// Ich
// lerne
// Java
Besonderheiten:
- Der Trenner ist ein Regex. Sonderzeichen müssen maskiert werden (z. B. der Punkt: "\\.").
- Die Methode gibt immer ein Array zurück, selbst wenn es nur ein Element ist.
9. Praxis: Strings in einer realen Anwendung vergleichen
String registeredEmail = "user@example.com";
String registeredPassword = "Secret123";
Scanner console = new Scanner(System.in);
System.out.print("E-Mail eingeben: ");
String email = console.nextLine();
System.out.print("Passwort eingeben: ");
String password = console.nextLine();
// E-Mail ohne Berücksichtigung der Groß-/Kleinschreibung vergleichen, das Passwort hingegen mit Berücksichtigung
if (email.equalsIgnoreCase(registeredEmail) && password.equals(registeredPassword))
{
System.out.println("Willkommen!");
}
else
{
System.out.println("Ungültige E-Mail oder falsches Passwort.");
}
Anmerkungen: Für die E-Mail verwenden wir equalsIgnoreCase(), für das Passwort strikt equals(). Den Operator == darf man für Strings nicht verwenden — er vergleicht Referenzen.
10. Typische Fehler beim Vergleich von Strings
Fehler Nr. 1: Strings mit == statt equals() vergleichen
Der Operator == vergleicht Referenzen, nicht den Inhalt; das Ergebnis kann daher unerwartet sein.
Fehler Nr. 2: equals() auf einem Objekt aufrufen, das null sein kann
Rufen Sie die Methode auf einem Objekt auf, das sicher nicht null ist, oder verwenden Sie Objects.equals(a, b).
Fehler Nr. 3: Groß-/Kleinschreibung ignorieren, obwohl sie wichtig ist
Passwörter sollten z. B. unter Beachtung der Groß-/Kleinschreibung verglichen werden. Klären Sie die Anforderungen.
Fehler Nr. 4: Strings mit Objekten anderer Typen vergleichen
"123" und 123 sind nicht dasselbe. equals() konvertiert Typen nicht automatisch.
Fehler Nr. 5: Sortieren von Strings mit unterschiedlicher Groß-/Kleinschreibung
Großbuchstaben kommen vor Kleinbuchstaben. Für eine Sortierung ohne Beachtung der Groß-/Kleinschreibung verwenden Sie Arrays.sort(array, String.CASE_INSENSITIVE_ORDER).
GO TO FULL VERSION