Java-Strings : operator!=/== oder equals zum Vergleich ?
-
Hi Leute,
ich bin mir gerade echt unsicher, ob die != und == operatoren für Java-Strings nun klappen oder nicht. Ich habe das Gefühl, dass es manchmal hinhaut und manchmal nicht.
Liegt das an mir, und vergleich wie zB String bla = "bla"; String blub = "blub";
if ( bla == "blub" ) { ... }
if ( bla == blub ) { ... }
etc. sind völlig legetim, oder sollte man tatsächlich eher equals() verwenden ?
-
Der Vergleich mit == und .equals() sind grundlegend Verschieden bei Strings. Sagen wir s1 und s2 sind Strings.
Mit s1 == s2 vergleichst du bloss die Referenzen der beiden Objekte s1 und s2. s1 == s2 ist genau dann true, wenn s1 und s2 die gleiche Referenz haben (also die gleiche Adresse im Speicher referenzieren).
Mit s1.equals(s2) vergleichst du den Inhalt der beiden Strings. Dieser Ausdruck ergibt true, wenn s1 und s2 die gleiche Zeichenkette enthalten. Die Referenznen (also die Adressen im Speicher) der Objekte dürfen allerdings verschieden sein.
-
Achso, ja klar, sind ja eig. auch pointer ;P
Aber wieso das dann sooft true bzw überhaupt irgendwann true ergibt, verstehe ich nicht. ZB :
String bla = "bla";
System.out.println ( bla == "bla" ) -> "true" . Hat das was mit den String-Literalen zu tun ? Irgendwas muss da ja anders sein ;P
-
Was ich oben erzählt habe stimmt im Prinzip schon. Allerdings hätte ich noch hinzufügen sollen, dass String Literale in Klassen intern speziell gehandhabt werden:
The Java Language Specification explains that "Literal strings within the same class in the same package represent references to the same String object."
The Language Specification explains that "String literals - or, more generally, strings that are the values of constant expressions - are 'interned' so as to share unique instances using the method String.intern."
Ist das verständlich?
*Edit
Falls dieses Verhalten verhindern möchtest, dann musst du das String Objekt explizit mit new String(..) erzeugen.
Hier ein Code-Beispiel:String s1 = "bla"; String s2 = "bla"; System.out.println(s1 == s2); // Liefert true String s3 = new String("bla"); String s4 = new String("bla"); System.out.println(s3 == s4); // Liefert false
-
AAchso, jetzt ist mir einiges klarer
Vielen Dank !