"" est une chaîne de caractères réelle, bien qu'elle soit vide.
null, cependant, signifie que la variable String ne pointe vers rien.
a==b
renvoie faux 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 pas égal à null, évidemment.
La différence réside dans le fait que, puisque "" est une chaîne de caractères réelle, vous pouvez toujours invoquer des méthodes ou des fonctions sur celle-ci, par exemple
a.length()
a.substring(0, 1)
et ainsi de suite.
Si la chaîne est nulle, comme b, Java lèvera un message d'erreur. NullPointerException
si vous avez essayé d'invoquer, disons :
b.length()
Si la différence que vous vous demandez est == par rapport à égal, c'est la suivante :
\== compare les références, comme si j'allais
String a = new String("");
String b = new String("");
System.out.println(a==b);
Le résultat serait faux car j'ai attribué deux objets différents, et a et b pointent vers des objets différents.
Cependant, a.equals(b)
dans ce cas, retournerait vrai, car equals
pour les chaînes de caractères retournera vrai si et seulement si l'argument String n'est pas nul et représente la même séquence de caractères.
Sachez toutefois que Java a un cas particulier pour les chaînes de caractères.
String a = "abc";
String b = "abc";
System.out.println(a==b);
On pourrait penser que la sortie serait false
car il devrait allouer deux chaînes de caractères différentes. En fait, Java va stagiaire les chaînes de caractères littérales (celles qui sont initialisées comme a et b dans notre exemple). Faites donc attention, car cela peut donner de faux positifs sur le fonctionnement de ==.