Vergleich von Strings in Java
Swipe um das Menü anzuzeigen
Beim Vergleichen zeigt Java ein etwas "niedrigeres" Verhalten als erwartet. Es erscheint offensichtlich, dass Zeichenketten genauso wie Zahlen verglichen werden könnten – mit ==. Schließlich, wenn zwei Zeichenketten identisch aussehen, warum sollten sie dann nicht gleich sein?
Das Problem mit ==
Wenn == mit Zeichenkettenliteralen verwendet wird, scheint es zunächst problemlos zu funktionieren:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Beide Variablen verweisen auf dasselbe Objekt im internen String-Pool von Java – wenn das gleiche Literal erneut erscheint, verwendet Java das bereits existierende. Daher ergibt == den Wert true.
Nun ändern wir leicht, wie die Strings erstellt werden:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Die Verwendung von new String() weist Java an, jedes Mal ein völlig separates Objekt zu erstellen – selbst wenn der Inhalt identisch ist. Da == Speicheradressen und nicht den Text vergleicht, ergibt es false.
Die wichtigste Regel: == betrachtet nicht den Text innerhalb des Strings – es prüft, ob beide Variablen auf exakt dasselbe Objekt im Speicher verweisen.
equals() — Vergleich des tatsächlichen Inhalts
Um den tatsächlichen Text in zwei Strings zu vergleichen, verwende .equals(). Der Speicherort wird dabei vollständig ignoriert, es werden nur die Zeichen verglichen:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Auch wenn order1 und order2 unterschiedliche Objekte im Speicher sind, vergleicht .equals() deren Inhalt und gibt true zurück.
Groß- und Kleinschreibung bei equals()
Java unterscheidet zwischen Groß- und Kleinschreibung, daher führen bereits Unterschiede in einem Buchstaben dazu, dass Zeichenketten als ungleich gelten:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" und "latte" werden als unterschiedliche Zeichenketten behandelt, daher ist das Ergebnis false.
equalsIgnoreCase() — Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung
Wenn Zeichenketten verglichen werden sollen, ohne auf Groß- oder Kleinschreibung zu achten, wird .equalsIgnoreCase() verwendet:
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() behandelt "Latte" und "LATTE" als identisch und gibt true zurück.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Vergleich von Strings in Java
Beim Vergleichen zeigt Java ein etwas "niedrigeres" Verhalten als erwartet. Es erscheint offensichtlich, dass Zeichenketten genauso wie Zahlen verglichen werden könnten – mit ==. Schließlich, wenn zwei Zeichenketten identisch aussehen, warum sollten sie dann nicht gleich sein?
Das Problem mit ==
Wenn == mit Zeichenkettenliteralen verwendet wird, scheint es zunächst problemlos zu funktionieren:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Beide Variablen verweisen auf dasselbe Objekt im internen String-Pool von Java – wenn das gleiche Literal erneut erscheint, verwendet Java das bereits existierende. Daher ergibt == den Wert true.
Nun ändern wir leicht, wie die Strings erstellt werden:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Die Verwendung von new String() weist Java an, jedes Mal ein völlig separates Objekt zu erstellen – selbst wenn der Inhalt identisch ist. Da == Speicheradressen und nicht den Text vergleicht, ergibt es false.
Die wichtigste Regel: == betrachtet nicht den Text innerhalb des Strings – es prüft, ob beide Variablen auf exakt dasselbe Objekt im Speicher verweisen.
equals() — Vergleich des tatsächlichen Inhalts
Um den tatsächlichen Text in zwei Strings zu vergleichen, verwende .equals(). Der Speicherort wird dabei vollständig ignoriert, es werden nur die Zeichen verglichen:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Auch wenn order1 und order2 unterschiedliche Objekte im Speicher sind, vergleicht .equals() deren Inhalt und gibt true zurück.
Groß- und Kleinschreibung bei equals()
Java unterscheidet zwischen Groß- und Kleinschreibung, daher führen bereits Unterschiede in einem Buchstaben dazu, dass Zeichenketten als ungleich gelten:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" und "latte" werden als unterschiedliche Zeichenketten behandelt, daher ist das Ergebnis false.
equalsIgnoreCase() — Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung
Wenn Zeichenketten verglichen werden sollen, ohne auf Groß- oder Kleinschreibung zu achten, wird .equalsIgnoreCase() verwendet:
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() behandelt "Latte" und "LATTE" als identisch und gibt true zurück.
Danke für Ihr Feedback!