"" est une chaîne réelle, bien que vide.
null, cependant, signifie que la variable String ne pointe vers rien.
a==b
renvoie false car "" et null n'occupent pas le même espace en mémoire - en d'autres termes, leurs variables ne pointent pas vers les mêmes objets.
a.equals(b)
renvoie false car "" n'est évidemment pas égal à null.
La différence est que puisque "" est une chaîne réelle, vous pouvez toujours appeler des méthodes ou des fonctions dessus comme
a.length()
a.substring(0, 1)
etc.
Si la chaîne est égale à null, comme b, Java lancerait a NullPointerException
si vous essayiez d'appeler, disons:
b.length()
Si la différence sur laquelle vous vous interrogez est == par rapport à égale, c'est la suivante:
== compare les références, comme si j'y allais
String a = new String("");
String b = new String("");
System.out.println(a==b);
Cela donnerait false parce que j'ai alloué deux objets différents et que a et b pointent vers des objets différents.
Cependant, a.equals(b)
dans ce cas, renvoie true, car equals
for Strings retournera true si et seulement si l'argument String n'est pas nul et représente la même séquence de caractères.
Soyez averti, cependant, que Java a un cas particulier pour les chaînes.
String a = "abc";
String b = "abc";
System.out.println(a==b);
On pourrait penser que la sortie serait false
, car elle devrait allouer deux chaînes différentes. En fait, Java internera des chaînes littérales (celles qui sont initialisées comme a et b dans notre exemple). Soyez donc prudent, car cela peut donner des faux positifs sur le fonctionnement de ==.
b.equals(a)
- mais ne l'utilisez pas==
pour la comparaison de chaînes car "cela ne fonctionnera pas" d'une autre manière. Lanull
valeur (qui est différente d'une chaîne vide""
, une instance String valide) ne peut jamais avoir une méthode invoquée dessus. Placer le "connu non nul" (généralement une valeur constante ou un littéral) sur le côté gauche de l'égalité est "Yoda conditionals" ou quelque chose comme ça.