if block mit equals im rumpf

dempsey

Mitglied
Ich habe mal eine recht simple Frage. Ich habe eine ganz normale IF-Else abfrage gemacht aber es hatte nicht funktioniert. Nun habe ich den Tip bekommen, die Abfrage anders zu gestalten. Es funktioniert jetzt auch so wie ich es haben möchte aber ich weiss nicht warum. Kann mir das wer mit einfachen Worten erläutern?

Java:
 if("String1".equals(oString)){
            System.out.println("if1");
        }
        else if("String2".equals(oString)){
            System.out.println("elseif2");
        }
        else if("String3".equals(oString)){
            System.out.println("elseif3");
        }
        else{
            System.out.println("keine option!!!");
        }


Und so hatte ich es vorher gehabt (funktionierte nicht)

Java:
        if(oString == "String1"){
            System.out.println("if1");
        }
        else if(oString == "String2"){
            System.out.println("elseif2");
        }
        else if(oString == "String3"){
            System.out.println("elseif3");
        }
        else{
            System.out.println("keine option!!!");
        }

oString wird als Parameter in die Funktion übergeben
 
Du hast bei deiner IF-Schleife nur einen Vergleich auf die Referenz des Strings geprüft aber nicht auf den "Inhalt" des String. Bei der jetzigen Version wird das mit der Methode ".equals" geprüft, deshalb funktioniert es jetzt ;-)
 
Das ist das "dasselbe" und "das Gleiche"-Problem.
Solltest du bestimmt schonmal gehört haben, die Leute laufen auf den Straßen en mass herum die nur darauf warten einen zu verbessern mit dem Satz "dasselbe oder das Gleiche?".

"Equals" stellt dar: das Gleiche
"==" stellt dar: dasselbe
Zwiebelfisch-Abc: dasselbe/das Gleiche - SPIEGEL ONLINE

Wenn du einen String mit einem anderen vergleichst und zwar so
Java:
"Hi" == "Hi"
wird im compilierten Code daraus soetwas wie: (Sind eigentlich StringBuilder und Methoden dieser)
Java:
new String() == new String()
Wie du siehst handelt es sich nicht um dieselben Objekte, aber sie sind sich sehr ähnlich, da sie beide die selben Buchstaben beinhalten, deshalb sind sie die gleichen Objekte und wenn man prüfen möchte ob zwei Objekte sich einander gleichen benötigt man .equals( Object o );

Gruß
Net
 
Zuletzt bearbeitet:
Der == Operator prüft auf Referenzgleichheit, also zeigen die Objekte auf den selben Eintrag im Speicher.
Equals() überprüft auf Gleichheit, was auch immer das für ein Objekt bedeutet.
 
@Network stimmt so Leider nicht:

Java:
if("Hi"=="Hi") <--- true
if(new String("Hi")==new String("Hi")) <--- false

Das manchmal true rauskommt, hängt mit dem Stringpool zusammen. Einmal erzeugte Strings werden darin abgelegt und wiederverwendet. Deswegen ist der Vergleich mit == oft wahr, aber nicht immer.
 
@Network stimmt so Leider nicht:

Java:
if("Hi"=="Hi") <--- true
if(new String("Hi")==new String("Hi")) <--- false

Das manchmal true rauskommt, hängt mit dem Stringpool zusammen. Einmal erzeugte Strings werden darin abgelegt und wiederverwendet. Deswegen ist der Vergleich mit == oft wahr, aber nicht immer.

Entschuldige meine Ausdrucksweise - ich werde mich selbst zensieren:
Das ist doch ****** egal für den Fragesteller ???:L Das ist eine dämliche extra Besonderheit von Strings die nur zur Verwirrung führt und keinesfalls in der Praxis tatsächlich angewandt werden sollte oder berücksichtig. Das ist doch nur klugs******* 😛ueh:
So vielen Dank 😀
(Das war zwar ernstgemeint aber die zensierten Ausdrucksweisen dienten nur zur Verstärkung des Tons 😀)
 
Zuletzt bearbeitet:
Das ist doch sch*** egal für den Fragesteller

Wäre ich der TO, dann würde mich der Grund interessieren und verwirrend sollte das auch nicht sein. Hier wird einfach recycling betrieben ;-). Angewandt werden sollte da garnichts. Einfach immer bedenken, dass man komplexe Objekte mit .equals vergleicht und eben nicht mit == (außer man prüft eben die referenz).
 
@Network
nana, wenn man das überhaupt weiter ausführt, dann doch besser nicht komplett in die falsche Richtung, sondern überzeugend erklären:
gerade [c]"Hi" == "Hi"[/c] ist der Problemfall, der tatsächlich mit true geht, weswegen das == bei String zu funktionieren scheint,

der Compiler wäre schön doof, da ständig neue "Hi" zu erzeugen, auch in verschiedenen Klassen direkt im Code abgelegt,
durch die Variablen gewandert sind solche Strings durchaus gleich, ich denke sogar in der Regel, nicht 'oft', auch nicht 'manchmal'

(besonders ist [c]new String( "Hi" )[/c] gar keine Lösung, nur eine rekursive Verschiedung, woher kommt das "Hi" als Parameter?
wenn es schon ein fertiger String ist, wieso dann noch new String() drumherum?)


-----

dagegen gibt es Strings aus Dateien, aus Texteingaben usw., auch da könnte ein "Hi" dabei sein,
aber die Laufzeitumgebung wird nicht mühsam nachschauen, ob es diesen String schon im Pool gibt,
sondern einen neuen String char für char konstruieren,
dieser ist dann der gleiche, aber nicht derselbe
 
Zuletzt bearbeitet von einem Moderator:
der Compiler wäre schön doof, da ständig neue "Hi" zu erzeugen, auch in verschiedenen Klassen direkt im Code abgelegt,
durch die Variablen gewandert sind solche Strings durchaus gleich, ich denke sogar in der Regel, nicht 'oft', auch nicht 'manchmal'

[OT]
😛opcorn: der Satz hats in sich 😀
[/OT]
 
dagegen gibt es Strings aus Dateien, aus Texteingaben usw., auch da könnte ein "Hi" dabei sein,
aber die Laufzeitumgebung wird nicht mühsam nachschauen, ob es diesen String schon im Pool gibt,
sondern einen neuen String char für char konstruieren,
Um die Verwirrung weiter zu treiben könnte man, wenn man weiß, das diese eingelesenen String oft den selben Inhalt haben nach dem Einlesen mit der
Code:
intern()
-Methode das im StringPool befindliche Objekt holen.

Das macht aber nur dann Sinn, wenn man mit einem OutOfMemoryError kämpft und andere Lösungen bereits versagt haben, als letzter Strohalm so zusagen...

bye
TT
 
halb Offtopic:
ach, wenn man so anfängt dann lieber gar nicht auf den Pool bauen, wer weiß ob der tatsächlich nun da ist, trotz aller 'Regel',
zumal vielleicht Rest der Programmlaufzeit unnötig zugemüllt, temporär reicht, etwa für eine große DB-Abfrage
->
ich hab schon überlegt, bei manchen solchen Fällen eine Map aufzubauen..
bisher konnte ich mich aber noch zusammenreißen

dann auch BigDecimal für Zahlen, Date usw.
 

Neue Themen


Zurück
Oben