Bedingung immer false, auch wenn zwei Strings gleich sind

Status
Nicht offen für weitere Antworten.
L

Ludaf

Gast
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!

MfG

Ludaf
 

hansz

Aktives Mitglied
So müsste es dann klappen:

Code:
/* Test.java */

import java.io.*;

public class Test {
  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.equals("hallo")) { 
      System.out.println("Puhh, geschafft!!!");
    }  else { 
      System.out.println("Zumindest das geht!");
    }
  }
}

Beim Vergleichen von Zeichenkette können die beiden Methoden

boolean equals(Object anObject)
boolean equalsIgnoreCase(String s)

verwendet werden. Der Operator "==" ist bei einem String nicht anwendbar (ist einfach so festgelegt in Java).
 

schalentier

Gesperrter Benutzer
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
  }
}

[klugscheissmode off]
 

hansz

Aktives Mitglied
Hallo nochmal,

hab auch noch mal ein bisschen getestet:

Code:
public class Test {
  
  public static void main( String[] args ) {

    String s1 = "Hallo";
    String s2 = "Hallo";
    String s3 = s2;
    
    if (s1 == s2) {
      System.out.println("s1 == s2");
    }
    if (s1 == s3) {
      System.out.println("s1 == s3");
    }
    if (s2 == s3) {
      System.out.println("s2 == s3");
    }
    
    if (s3 == "Hallo") {
      System.out.println("s3 == \"Hallo\"");
    }
   
  }
}

Mit der Ausgabe:
s1 == s2
s1 == s3
s2 == s3
s3 == "Hallo"


Mit javap -c Test

erhält man dann

Code:
public static void main(java.lang.String[]);
  Code:
   0:	ldc	#2; //String Hallo
   2:	astore_1
   3:	ldc	#2; //String Hallo
   5:	astore_2
   6:	aload_2
   7:	astore_3
   8:	aload_1
   9:	aload_2
   10:	if_acmpne	21
   13:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   16:	ldc	#4; //String s1 == s2
   18:	invokevirtual	#5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   21:	aload_1
   22:	aload_3
   23:	if_acmpne	34
   26:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   29:	ldc	#6; //String s1 == s3
   31:	invokevirtual	#5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   34:	aload_2
   35:	aload_3
   36:	if_acmpne	47
   39:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   42:	ldc	#7; //String s2 == s3
   44:	invokevirtual	#5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   47:	aload_3
   48:	ldc	#2; //String Hallo
   50:	if_acmpne	61
   53:	getstatic	#3; //Field java/lang/System.out:Ljava/io/PrintStream;
   56:	ldc	#8; //String s3 == \"Hallo\"
   58:	invokevirtual	#5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   61:	return


Die Ausgabe des Java-Disassemblers javap erklärt die letzte Zeile der Ausgabe:

s3 == "Hallo"

entspricht ja

47: aload_3
48: ldc #2; //String Hallo
50: if_acmpne 61
53: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
56: ldc #8; //String s3 == \"Hallo\"
58: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
 

Ark

Top Contributor
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:

Ark
 
G

Gast

Gast
== 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.

Gruss

Alex
 

Marco13

Top Contributor
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...)
 

hansz

Aktives Mitglied
Ja genau,

besten Dank an Alex und Marco.

Code:
/* 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.
 
L

Ludaf

Gast
Danke für eure "Aufklärung" meiner Unwissenheit! Da ich nicht im Forum angemledet bin, bitte ich einen Moderator das Thema abzuhaken!

MfG

Ludaf
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
Lion.King if-Bedingung Java Basics - Anfänger-Themen 3
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
L while Schleife mit 2 Bedingung endet nicht Java Basics - Anfänger-Themen 3
M Wie lassen sich Konstanten in Bedingung stellen? Java Basics - Anfänger-Themen 1
M Wie lassen sich Objektkonstanten initialisieren, wenn sie eine Bedingung erreichen? Java Basics - Anfänger-Themen 6
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
A Dividieren mit Bedingung? Java Basics - Anfänger-Themen 7
P Bedingung in Schleife wird nicht ausgeführt Java Basics - Anfänger-Themen 5
Dimax Collections groupingBy mit Bedingung Java Basics - Anfänger-Themen 11
H Frage zur if-Bedingung bzw switch case Java Basics - Anfänger-Themen 6
F Bedingung für Eingabe Java Basics - Anfänger-Themen 2
scratchy1 Variablen vertauschen wenn Bedingung "umgedreht" wird Java Basics - Anfänger-Themen 40
Hanschyo If Bedingung Fehler Java Basics - Anfänger-Themen 7
T Komischer Fehler mit einer if-Bedingung Java Basics - Anfänger-Themen 3
W while Schleife und Bedingung Java Basics - Anfänger-Themen 11
E if-Bedingung mit mehreren Möglichkeiten ? Java Basics - Anfänger-Themen 6
S DefaultTableCellRenderer mit Bedingung Java Basics - Anfänger-Themen 1
J Fehler abfangen mit einer Bedingung Java Basics - Anfänger-Themen 3
Z Verschachtelte If-Bedingung Java Basics - Anfänger-Themen 6
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
I Welche Schleife/Bedingung nehme ich her Java Basics - Anfänger-Themen 5
C Compiler-Fehler Wird eine if Bedingung nach einer for-Schleife nach jeder Iteration überprüft? Java Basics - Anfänger-Themen 1
B Kann mir jemand diese Bedingung erklären Java Basics - Anfänger-Themen 5
L Methoden if Bedingung trotz Erfüllung, nicht angesprochen Java Basics - Anfänger-Themen 12
P Compiler-Fehler if Bedingung fehlerhaft Java Basics - Anfänger-Themen 7
X Schleife bis "Bedingung" ausführen Java Basics - Anfänger-Themen 13
TheMenox Verschachtelte If Bedingung Java Basics - Anfänger-Themen 4
M Erste Schritte if-Bedingung schlägt fehl Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
Ocram Variablen Vereinfachung einer Bedingung Java Basics - Anfänger-Themen 18
J Can't find symbol - Erstellung eines Objekts in if-Bedingung Java Basics - Anfänger-Themen 3
M Frage zu if-Bedingung Java Basics - Anfänger-Themen 1
F Erste Schritte If Bedingung in Schleife dynamisch erweitern Java Basics - Anfänger-Themen 4
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
R for-Schleife bei erfüllter Bedingung beenden Java Basics - Anfänger-Themen 7
R if funktion ohne else - Bedingung trifft nicht zu, ausgabe nicht nachvollziehbar Java Basics - Anfänger-Themen 7
S if bedingung - Stunde und Minute vergleichen Java Basics - Anfänger-Themen 5
K If-Bedingung mit Wertzuweisung Java Basics - Anfänger-Themen 2
J Vererbung If-Bedingung im Konstruktor Java Basics - Anfänger-Themen 15
J Arrays prüfen und über if Bedingung ausgeben Java Basics - Anfänger-Themen 15
T if Bedingung Java Basics - Anfänger-Themen 16
MiMa for Schleife Bedingung Java Basics - Anfänger-Themen 4
M in jTable schreiben unter Bedingung Java Basics - Anfänger-Themen 3
J Erste Schritte Kurze Frage zu Listenern und If-Bedingung Java Basics - Anfänger-Themen 2
N Verifikation einer if-Bedingung Java Basics - Anfänger-Themen 9
P Variablen ArrayList mit Bedingung iterieren Java Basics - Anfänger-Themen 2
E if(Bedingung) Java Basics - Anfänger-Themen 9
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6
Anfänger2011 Wie bricht man alles ab wenn eine Bedingung nicht erfüllt ist? Java Basics - Anfänger-Themen 21
P Variablen Variable in if Bedingung anlegen, Wert zuweisen und diesen als Bedingung nutzen Java Basics - Anfänger-Themen 4
M Und Bedingung Java Basics - Anfänger-Themen 17
N Bedingung für Datentypen Java Basics - Anfänger-Themen 3
E if-Bedingung funktioniert nicht Java Basics - Anfänger-Themen 9
W Funktionsaufruf nach Bedingung Java Basics - Anfänger-Themen 3
S for schleife mit if bedingung Java Basics - Anfänger-Themen 21
S return(Bedingung) ? [mehrere Befehle] Java Basics - Anfänger-Themen 5
2 Bedingung bei Schleife Java Basics - Anfänger-Themen 23
E Methode in der Bedingung Java Basics - Anfänger-Themen 11
E if Bedingung Java Basics - Anfänger-Themen 4
H Sortierung eines String[][] mit Bedingung Java Basics - Anfänger-Themen 7
H Bedingung while-Schleife | integer number too large Java Basics - Anfänger-Themen 2
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
I Potenzmenge mit Bedingung Java Basics - Anfänger-Themen 24
S If-Bedingung Java Basics - Anfänger-Themen 15
P Einfache Bedingung (?) in Java Java Basics - Anfänger-Themen 3
K Fragen zu If-Bedingung Java Basics - Anfänger-Themen 3
S bedingung in variable speichern? Java Basics - Anfänger-Themen 8
neurox Ergebnis der if-Bedingung weiter verwenden Java Basics - Anfänger-Themen 5
G If-Schleife läuft ohne erfüllte Bedingung Java Basics - Anfänger-Themen 13
K Logik in if-Bedingung Java Basics - Anfänger-Themen 2
S if anweisung wird ausgeführt egal ob bedingung true o. false Java Basics - Anfänger-Themen 2
S For Schleife, Bedingung Java Basics - Anfänger-Themen 4
S Wildcard-Bedingung Java Basics - Anfänger-Themen 10
G Probleme mit break hier; in if-Bedingung Java Basics - Anfänger-Themen 5
M Schleife abhängig von Bedingung Java Basics - Anfänger-Themen 5
G while Bedingung? Java Basics - Anfänger-Themen 6
L IF Bedingung in SELECT Statement? Java Basics - Anfänger-Themen 3
M Kleine Frage zu If-Bedingung Java Basics - Anfänger-Themen 4
Bierhumpen String Bedingung. Java Basics - Anfänger-Themen 8
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
R Klassen nach Bedingung laden Java Basics - Anfänger-Themen 22
G Compiler sieht die Bedingung nicht! Java Basics - Anfänger-Themen 5
W if Bedingung mit "Außer" Java Basics - Anfänger-Themen 4
krgewb Immer dieselbe Zufallszahl Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
J Componente immer in Front halten, wie? Java Basics - Anfänger-Themen 5
berserkerdq2 Brauche ich while != -1, wenn ich immer einen BufferedReader verwende? Java Basics - Anfänger-Themen 8
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben