==
vergleicht Objektreferenzen.
.equals()
vergleicht String-Werte.
Manchmal ==
gibt Illusionen über den Vergleich von String-Werten, wie in den folgenden Fällen:
String a="Test";
String b="Test";
if(a==b) ===> true
Wenn Sie nämlich ein String-Literal erstellen, sucht die JVM zunächst nach diesem Literal im String-Pool, und wenn sie eine Übereinstimmung findet, wird diese Referenz dem neuen String zugewiesen. Aus diesem Grund erhalten wir:
(a==b) ===> wahr
String Pool
b -----------------> "test" <-----------------a
Allerdings, ==
schlägt im folgenden Fall fehl:
String a="test";
String b=new String("test");
if (a==b) ===> false
In diesem Fall für new String("test")
wird die Anweisung new String auf dem Heap erstellt, und diese Referenz wird an b
also b
wird ein Verweis auf den Heap und nicht auf den String-Pool gegeben.
Jetzt a
auf einen String im String-Pool verweist, während b
auf einen String auf dem Heap verweist. Deshalb erhalten wir:
if(a==b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Während .equals()
vergleicht immer einen Wert von String, so dass es in beiden Fällen wahr ergibt:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Also mit .equals()
ist immer besser.