194 votes

Différence entre null et "" Java String

Quelle est la différence entre null et le "" (chaîne vide) ?

J'ai écrit un code simple comme celui-ci :

String a = "";
String b = null;

System.out.println(a==b); // false
System.out.println(a.equals(b)); // false

Et les deux déclarations retournent false . Et il semble que je ne sois pas capable de trouver quelle est la différence réelle entre eux.

250voto

Zach L Points 7261

"" 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 ==.

18voto

Aba Dov Points 785

String est un objet et peut être nul

null signifie que l'objet String n'a pas été instancié.

"" est une valeur réelle de la chaîne d'objets instanciée comme "aaa".

Voici un lien qui pourrait clarifier ce point http://download.oracle.com/javase/tutorial/java/concepts/object.html

14voto

Arkaaito Points 4392

Ce que vos déclarations vous disent, c'est que "" n'est pas identique à null - ce qui est vrai. "" est une chaîne vide ; null signifie qu'aucune valeur n'a été attribuée.

Il serait peut-être plus éclairant d'essayer :

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" est toujours une chaîne, ce qui signifie que vous pouvez appeler ses méthodes et obtenir des informations significatives. null est une variable vide - il n'y a littéralement rien.

11voto

templatetypedef Points 129554

Il existe une différence assez importante entre les deux. La chaîne vide "" est "la chaîne qui ne contient aucun caractère". C'est une chaîne réelle qui a une longueur bien définie. Toutes les opérations standard sur les chaînes de caractères sont bien définies sur la chaîne vide - vous pouvez la convertir en minuscules, rechercher l'indice d'un caractère dans la chaîne, etc. La chaîne nulle null est "pas de ficelle du tout". Elle n'a pas de longueur parce que ce n'est pas une chaîne du tout. Si vous essayez d'appliquer une opération standard sur la chaîne nulle, vous obtiendrez un message d'erreur. NullPointerException au moment de l'exécution.

9voto

Shamim Hafiz Points 8419

null signifie que le nom ne fait pas référence à un objet instancié. "" signifie une chaîne vide.

Ici a fait référence à un objet qui se trouve être une chaîne vide. b ne fait pas référence à un objet puisqu'il est nul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X