1. Einführung
Warum ist der String‑Vergleich in Java wichtig?
In der Java‑Programmierung werden Strings in vielen Situationen verwendet. Das Prüfen von Benutzernamen, die Validierung von Formulareingaben und das Verifizieren von API‑Antworten erfordern alle den Vergleich von Strings.
An dieser Stelle ist „wie man Strings korrekt vergleicht“ ein häufiges Stolpersteinelement für Anfänger. Insbesondere kann das Missverständnis des Unterschieds zwischen dem ==‑Operator und der equals()‑Methode zu unerwarteten Bugs führen.
Die Gefahr, den Unterschied zwischen „==“ und „equals“ nicht zu verstehen
Betrachten Sie den folgenden Code:
String a = "apple";
String b = new String("apple");
System.out.println(a == b); // result: false
System.out.println(a.equals(b)); // result: true
Viele Menschen sind von dieser Ausgabe überrascht. Obwohl die Strings identisch sind, liefert == false, während equals() true zurückgibt. Das passiert, weil Java Strings als Referenztypen behandelt und == Referenzadressen vergleicht.
Das korrekte Vergleichen von Strings wirkt sich direkt auf die Zuverlässigkeit und Lesbarkeit Ihres Programms aus. Wenn Sie es richtig verstehen, können Sie Bugs verhindern, bevor sie auftreten.
Was Sie in diesem Artikel lernen werden
Dieser Artikel erklärt den Java‑String‑Vergleich von den Grundlagen bis zu praktischen Anwendungen. Er beantwortet Fragen wie:
- Was ist der Unterschied zwischen
==undequals()? - Wie vergleicht man Strings, wobei die Groß‑/Kleinschreibung ignoriert wird?
- Wie vergleicht man Strings lexikografisch?
- Wie vermeidet man Ausnahmen beim Vergleich mit
null?
Durch praxisnahe Beispiele erhalten Sie ein solides Verständnis von korrekten Praktiken beim String‑Vergleich.
2. Grundlagen von Strings in Java
Strings sind Referenztypen
In Java ist der Typ String kein primitiver Datentyp (wie int oder boolean), sondern ein Referenztyp. Eine String‑Variable speichert nicht die eigentlichen Zeichen, sondern eine Referenz auf ein im Heap‑Speicher abgelegtes Objekt.
Zum Beispiel:
String a = "hello";
String b = "hello";
Sowohl a als auch b können sich auf dasselbe Literal "hello" beziehen, weil Java einen String‑Interning‑Mechanismus verwendet.
Unterschied zwischen String‑Literals und new String()
Java optimiert wiederholte String‑Literals, indem es dieselbe Referenz wiederverwendet:
String s1 = "apple";
String s2 = "apple";
System.out.println(s1 == s2); // true (same literal, interned)
Wird jedoch new verwendet, wird immer ein neues Objekt erzeugt:
String s3 = new String("apple");
System.out.println(s1 == s3); // false (different references)
System.out.println(s1.equals(s3)); // true (same content)
Daher prüft == die Referenz und equals() den Inhalt.
Strings sind unveränderlich
Ein weiteres wichtiges Merkmal ist, dass String immutable (unveränderlich) ist. Einmal erstellt, kann ein String nicht mehr geändert werden.
String original = "hello";
original = original + " world";
Dies erzeugt ein neues String‑Objekt, anstatt das Original zu modifizieren.
3. Methoden zum Vergleichen von Strings
Vergleich von Referenzen mit ==
== vergleicht Objekt‑Referenzen:
String a = "Java";
String b = new String("Java");
System.out.println(a == b); // false
Es sollte nicht für den Inhaltsvergleich verwendet werden.
Vergleich von Inhalten mit equals()
equals() ist der korrekte Weg, um String‑Inhalte zu vergleichen:
String a = "Java";
String b = new String("Java");
System.out.println(a.equals(b)); // true
Vermeidung von NullPointerException
String input = null;
System.out.println(input.equals("test")); // Exception!
Verwenden Sie den konstant‑zuerst‑Stil:
System.out.println("test".equals(input)); // false, safe
Ignorieren der Groß‑/Kleinschreibung mit equalsIgnoreCase()
String a = "Hello";
String b = "hello";
System.out.println(a.equalsIgnoreCase(b)); // true
Lexikografischer Vergleich mit compareTo()
- 0 → gleich
- Negativ → Aufrufer kommt vorher
- Positiv → Aufrufer kommt nach
String a = "apple"; String b = "banana"; System.out.println(a.compareTo(b)); // negative
4. Praktische Beispiele
Überprüfung des Benutzer‑Logins
String inputUsername = "Naohiro";
String registeredUsername = "naohiro";
if (registeredUsername.equalsIgnoreCase(inputUsername)) {
System.out.println("Login successful");
} else {
System.out.println("Username does not match");
}
Passwörter sollten immer equals() verwenden, da Groß‑/Kleinschreibung erforderlich ist. 
Formular‑Eingabevalidierung
String selectedOption = request.getParameter("plan");
if ("premium".equals(selectedOption)) {
System.out.println("Premium plan selected.");
} else {
System.out.println("Other plan selected.");
}
Verzweigungslogik mit mehreren String‑Überprüfungen
String cmd = args[0];
if ("start".equals(cmd)) {
startApp();
} else if ("stop".equals(cmd)) {
stopApp();
} else {
System.out.println("Invalid command");
}
switch (cmd) {
case "start":
startApp();
break;
case "stop":
stopApp();
break;
default:
System.out.println("Unknown command");
}
Null sicher behandeln
String keyword = null;
if ("search".equals(keyword)) {
System.out.println("Searching...");
}
5. Leistung und Optimierung
Kosten von String‑Vergleichen
equals() und compareTo() vergleichen intern Zeichen. Bei langen Strings oder wiederholten Vergleichen kann dies die Leistung beeinträchtigen.
Verwendung von String.intern() zur Leistungssteigerung
String a = new String("hello").intern();
String b = "hello";
System.out.println(a == b); // true
Nur bei Bedarf verwenden, um Speicherbelastungen zu vermeiden.
Leistungseinfluss von equalsIgnoreCase()
String input = userInput.toLowerCase();
if ("admin".equals(input)) {
// fast comparison
}
Verwendung von StringBuilder / StringBuffer
StringBuilder sb = new StringBuilder();
sb.append("user_");
sb.append("123");
String result = sb.toString();
if (result.equals("user_123")) {
// comparison
}
Caching oder Maps verwenden, um Vergleiche zu reduzieren
Map<String, Runnable> commandMap = new HashMap<>();
commandMap.put("start", () -> startApp());
commandMap.put("stop", () -> stopApp());
Runnable action = commandMap.get(inputCommand);
if (action != null) {
action.run();
}
6. FAQ
Q1. Was ist der Unterschied zwischen == und equals()?
A.
==vergleicht Referenzenequals()vergleicht den String‑Inhalt
Q2. Warum wirft equals() einen Fehler, wenn die Variable null ist?
String input = null;
input.equals("test"); // Exception
Verwenden Sie einen Konstanten‑zuerst‑Vergleich:
"test".equals(input);
Q3. Wie vergleiche ich Strings ohne Berücksichtigung der Groß‑/Kleinschreibung?
stringA.equalsIgnoreCase(stringB);
Q4. Wie vergleiche ich die alphabetische Reihenfolge?
a.compareTo(b);
7. Fazit
Die richtige Wahl der Vergleichsmethode ist wichtig
Da String ein Referenztyp ist, führt ein falscher Vergleich häufig zu unerwartetem Verhalten. Das Verständnis von == vs equals() ist entscheidend.
Checkliste
==: vergleicht Referenzenequals(): vergleicht den InhaltequalsIgnoreCase(): ignoriert Groß‑/KleinschreibungcompareTo(): lexikografische Reihenfolge"constant".equals(variable): null‑sicher- Verwenden Sie
intern()oder Caching für häufige Vergleiche
Praktisches und essentielles Wissen
String‑Vergleiche kommen bei Login‑Überprüfungen, Validierung, Datenbankoperationen, Verzweigungslogik und vielen täglichen Aufgaben vor. Das Wissen um die richtigen Techniken hilft, sichereren und zuverlässigeren Code zu schreiben. Verwenden Sie diesen Leitfaden als Referenz beim Arbeiten mit Strings in Java.

