CodeGym /Kurse /JAVA 25 SELF /String-Vergleich: equals, equalsIgnoreCase, compareTo

String-Vergleich: equals, equalsIgnoreCase, compareTo

JAVA 25 SELF
Level 9 , Lektion 4
Verfügbar

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“
equals()
Ja
false
equalsIgnoreCase()
Nein
true

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
Lexikografischer Vergleich: Ergebnis von 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).

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION