Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Bedingung immer false, auch wenn zwei Strings gleich sind
Ich möchte eine eingelesene String-Variablen mit einer if-Anweisung auf eine Übereinstimmung mit dem Wert einer
anderen String-Variablen prüfen. Der Quellcode den ich versucht habe, führt allerdings dazu, dass nie die Be-
dingung erfüllt wird. Warum??
Hier ist ein kleines Bsp.-Prog., dass das Problem klar macht:
Code:
import java.io.*;
public class ET {
public static void main(String[] args)
{
String zeile = "blabla" ;
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader eingabe = new BufferedReader(reader);
try {
zeile = eingabe.readLine();
}
catch(IOException e) {
e.printStackTrace();
}
System.out.println(zeile);
if ( zeile == "hallo"){ System.out.println("Puhh, geschafft!!!");} //warum bei eingabe von hallo nicht erfüllbar??
else System.out.println("Zumindest das geht!");
}
}
Über eine Lösung des Problems mit Erklärung(warum funktoniert meins nicht?) würde ich mich freuen!
Naja... anwendbar is das schon, nur vergleicht "==" bei Strings, ob die Strings auch wirklich die gleiche Instanz sind.
Code:
public Foo{
public static final CONST_STR="bar";
public static void main( String[] args ) {
String a = CONST_STR;
assertTrue( a==CONST_STR ); // klappt und is viel schneller als a.equals( CONST_STR )
assertTrue( "bar"==CONST_STR ); // klappt nicht, da "bar" ne neue Instanz ist
assertTrue( "bar".equals( CONST_STR ) ); // klappt, da equals die Strings zeichenweise vergleicht
}
}
Immer wieder dasselbe leidige Problem: ist a nur der gleiche String wie b oder ist es derselbe? Denkt dann einfach an "Matrix", wo Trinity Neo nicht umsonst fragt, ob es dieselbe Katze gewesen sei. Denn wenn es nur die gleiche Katze gewesen wäre, wäre dies kein Grund zur Sorge.
Meine Mutter hat übrigens bis heute nicht verstanden, was der Unterschied zwischen "das Gleiche" und "dasselbe" ist. :lol:
== vergleicht einfach die Speicheradressen von den Strings, d.h. zwei Strtings sind genau dann gleich, wenn es das gleiche Strtingobjekt ist. Schreibt man mehrmals "blubb" als String, dann wird der String an allen Stellen geinlined und hat entsprechend die gleiche Speicheradresse. Also ist der == Operator grundsätzlich schon anwendbar, allerdings liefert er nur true, wenn es sich tatsächlich ums gleiche exemplar einer klasse handelt. Strings die nciht geinlined werden darf man nicht mit == vergleichen. dafür gibts equals. Equals vergleicht nicht die Speicheradressen des Strigns, sondern den Wert, also die Zeichenkette selbst.
Viele (überflüssige?) Antworten und (überflüssige?) Erklärugnen zum immer gleichen Thema (wie war das in der ersten Antwort?). Aber dass es DOCH Fälle gibt, über die man (auch als erfahrener Java-Programmierer, und auch, wenn man den Unterschied zwischen "das gleiche" und "dasselbe" bzw. "equals" und "==" kennt) leicht mal stolpern kann, sieht man ja an dem Mini-Testprogramm im oben geposteten Link. Dort sind auch die Erklärungen dazu, die über das "== vs. equals" hinausgehen (nämlich z.B. die Frage, WANN strings "internalisiert" werden usw...)
/* Test.java */
public class Test {
public static void main(String[] args) {
String s1 = "Hallo";
String s21 = "Hallo";
String s22 = new String("Hallo");
// Vergleich: s1 mit s21
if (s1 == s21) {
System.out.println("Die Strings s1 und s21 sind gleich (==).");
} else {
System.out.println("Die Strings s1 und s21 sind nicht gleich (==).");
}
if (s1.equals(s21)) {
System.out.println("Die Strings s1 und s21 sind gleich (equals).");
} else {
System.out.println("Die Strings s1 und s21 sind nicht gleich (equals).");
}
// Vergleich: s1 mit s22
if (s1 == s22) {
System.out.println("Die Strings s1 und s22 sind gleich (==).");
} else {
System.out.println("Die Strings s1 und s22 sind nicht gleich (==).");
}
if (s1.equals(s22)) {
System.out.println("Die Strings s1 und s22 sind gleich (equals).");
} else {
System.out.println("Die Strings s1 und s22 sind nicht gleich (equals).");
}
}
}
Ausgabe:
Die Strings s1 und s21 sind gleich (==).
Die Strings s1 und s21 sind gleich (equals). Die Strings s1 und s22 sind nicht gleich (==).
Die Strings s1 und s22 sind gleich (equals).
"Die Strings s1 und s21 sind gleich (==)." - gleiche String-Objekte.
"Die Strings s1 und s22 sind nicht gleich (==)." - unterschiedliche String-Objekte.