==
compare les références d'objets.
.equals()
compare des valeurs de type String.
Parfois ==
donne l'illusion de comparer les valeurs des chaînes, comme dans les cas suivants :
String a="Test";
String b="Test";
if(a==b) ===> true
En effet, lorsque vous créez un littéral de chaîne, la JVM recherche d'abord ce littéral dans le pool de chaînes, et si elle trouve une correspondance, cette même référence sera donnée à la nouvelle chaîne. De ce fait, nous obtenons :
(a==b) ===> vrai
String Pool
b -----------------> "test" <-----------------a
Cependant, ==
échoue dans le cas suivant :
String a="test";
String b=new String("test");
if (a==b) ===> false
Dans ce cas, pour new String("test")
l'instruction new String sera créée sur le tas, et cette référence sera donnée à b
donc b
se verra attribuer une référence sur le tas, et non dans le pool String.
Maintenant a
pointe vers une chaîne dans le pool de chaînes alors que b
pointe vers une chaîne sur le tas. A cause de cela, nous obtenons :
si(a==b) ===> faux.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Alors que .equals()
compare toujours une valeur de String, donc il donne vrai dans les deux cas :
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Donc, en utilisant .equals()
est toujours mieux.
12 votes
Il est également bon de savoir que, si vous remplacez la méthode .equals (), assurez-vous de remplacer la méthode .hashcode (), sinon vous finirez par violer la relation d'équivalence entre equals et hashcode. Pour plus d'informations, consultez la documentation java.
0 votes
Je laisse un lien vers mon explication du pourquoi
==
fonctionne comme sur les Objets : stackoverflow.com/a/19966154/22846410 votes
==
fonctionnera parfois, car java dispose d'un pool de chaînes de caractères, dans lequel il tente de réutiliser les références mémoire des chaînes de caractères les plus utilisées. Mais==
compare que les objets sont égaux, pas les valeurs... donc.equals()
est le bon usage que vous voulez utiliser.0 votes
N'utilisez jamais == pour vérifier si les chaînes sont identiques, à moins que vous n'aimiez traquer les erreurs subtiles et étudier les subtilités du processus d'internalisation des chaînes en Java.
"12"=="1"+2
est faux (probablement)