Quelle est la différence entre null
et la ""
(chaîne vide)?
J'ai écrit un code simple:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Les deux instructions reviennent false
. Il semble que je ne suis pas en mesure de trouver quelle est la différence réelle entre eux.
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.Réponses:
"" 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
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, carequals
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.
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 ==.la source
intern
a expiré. Vous pouvez vous référer à un autre site pour en savoir plus: weblogs.java.net/blog/enicholas/archive/2006/06/…String a = null
et que je lui ajoute une chaîne commea+= "example"
, lorsque je l'imprime, pourquoi s'affichenullexample
si null n'est pas une chaîne?"num: " + 20
vous donne la chaîne"num: 20"
. Cela signifie-t-il que20
c'est une chaîne? (ce n'est pas,20
c'est un nombre). Même cas pournull
: ce n'est pas une chaîne, mais elle peut être convertie en une si vous essayez de l'ajouter.Vous pouvez également comprendre la différence entre null et une chaîne vide de cette façon:
Image originale de R. Sato ( @raysato )
la source
La chaîne est un objet et peut être null
null signifie que l'objet String n'a pas été instancié
"" est une valeur réelle de la chaîne d'objet instanciée comme "aaa"
Voici un lien qui pourrait clarifier ce point http://download.oracle.com/javase/tutorial/java/concepts/object.html
la source
if (mp==null){do something}
.Ce que vos déclarations vous disent, c'est simplement que "" n'est pas la même chose que null - ce qui est vrai. "" est une chaîne vide; null signifie qu'aucune valeur n'a été attribuée.
Il peut être plus intéressant d'essayer:
"" 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 ici.
la source
Il y a une différence assez significative 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 de chaîne standard sont bien définies sur la chaîne vide - vous pouvez la convertir en minuscules, rechercher l'index de certains caractères, etc. La chaîne nullenull
est "pas de chaîne du tout". Il n'a pas de longueur car ce n'est pas du tout une chaîne. Essayer d'appliquer une opération de chaîne standard à la chaîne nulle entraînera unNullPointerException
à l'exécution.la source
ici
a is an Object
maisb(null)
n'est pas un objet c'est une référence nullevoici ma réponse similaire
la source
a
etb
sont des références.a
est une référence avec un objet instancié.b
est une référence sans objet instancié (d'où le terme «référence nulle»).null
valeur et la différence entre les objets et les variables.null signifie que le nom ne fait référence à aucun 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 référence à aucun objet car il est nul.
la source
En Java, un type de référence attribué
null
n'a aucune valeur . Une chaîne affectée""
a une valeur: une chaîne vide, c'est-à-dire une chaîne sans caractère. Lorsqu'une variable est affectée,null
cela signifie qu'il n'y a aucun objet sous-jacent d'aucune sorte, chaîne ou autre.la source
"" et null sont tous deux différents. le premier signifie que dans le cadre de la déclaration de variable de chaîne, la constante de chaîne a été créée dans le pool de chaînes et de la mémoire a été affectée à la même chose.
Mais lorsque nous le déclarons avec null, il vient d'être instancié jvm, mais aucune mémoire ne lui a été allouée. donc si vous essayez d'accéder à cet objet en le vérifiant avec la variable "" - vide, cela ne peut pas empêcher nullpointerexception. Veuillez trouver ci-dessous un cas d'utilisation.
}
la source
Une référence à une chaîne vide
""
pointe vers un objet dans le tas - vous pouvez donc appeler des méthodes dessus.Mais une référence pointant vers
null
n'a aucun objet à pointer dans le tas et vous obtiendrez ainsi un fichierNullPointerException
.la source
De l'article wikipedia sur la chaîne vide .
la source
String s=null;
La chaîne n'est pas initialisée pour null. si une opération de chaîne a essayé, elle peut lever une exception de pointeur nul
String t="null";
Il s'agit d'un littéral de chaîne avec une chaîne de valeur "null" identique à t = "xyz". Il ne lancera pas de pointeur nul.
String u="";
C'est comme une chaîne vide, il ne lancera pas de pointeur nul.
la source
Une chaîne peut être vide ou avoir une
null
valeur. Si une chaîne estnull
, elle ne fait référence à rien en mémoire. Essayezs.length()>0
. En effet, si une chaîne est vide, elle renvoie toujours une longueur de 0. Donc, si vous n'entrez rien pour la même chose, elle continuera alors à boucler car elle n'enregistre pas la chaîne sousnull
. Alors que si vous vérifiez la longueur, alors il sortira de sa boucle.la source
Ce concept peut être mieux compris à partir des mathématiques. Avez-vous déjà essayé de diviser un nombre (pas zéro) par 0 à l'aide d'une calculatrice, par exemple 7/0? Vous obtiendrez un résultat qui ressemble à quelque chose de ceci:
undefined
,not a number
,null
etc. Cela signifie que l'opération est impossible, pour certaines raisons (Quittons ces raisons à discuter un autre jour).Maintenant, effectuez ceci: 0/7. Vous obtiendrez la sortie, 0. Cela signifie que l'opération est possible et peut être exécutée, mais vous la réponse est juste 0 car il ne reste plus rien après la division. Il existe une sortie valide et cette sortie est égale à zéro.
Dans le premier exemple, non seulement la sortie était invalide, mais l'opération n'était pas possible à exécuter. Cela s'apparente à une
null
chaîne en java. Le deuxième exemple s'apparente à laempty
chaîne.la source
Quand tu écris
String a = "";
Cela signifie qu'il existe une variable 'a' de type string qui pointe vers une référence d'objet dans le pool de chaînes qui a une valeur "". En tant que variable
a
contient une référence d'objet chaîne valide, toutes les méthodes de chaîne peuvent être appliquées ici.Alors que quand tu écris
String b = null;
Cela signifie qu'il existe une variable
b
de type string qui pointe vers une référence inconnue . Et toute opération sur une référence inconnue entraînera unNullPointerException
.Maintenant, évaluons les expressions ci-dessous.
la source
En termes simples,
"" est une chaîne vide
null est une variable chaîne vide .
la source
Différence entre une chaîne nulle et une chaîne vide. Par exemple: vous avez une variable nommée x. Si vous écrivez en JS,
var x = "";
cela signifie que vous avez attribué une valeur qui est une chaîne vide (la longueur est 0). En fait, c'est comme quelque chose mais qui est une sensation de rien :) D'un autre côté,
var y = null;
cela signifie que vous n'avez pas attribué à y une valeur clairement indiquée en écrivant null à y au moment de la déclaration. Si vous écrivez y.length; il lancera une erreur qui indique qu'aucune valeur attribuée à y et par conséquent ne peut lire la longueur de y.
la source
Cette image peut vous aider à comprendre les différences.
L'image a été collectée auprès de ProgrammerHumor
la source
"J'appelle cela mon erreur d'un milliard de dollars. C'était l'invention de la référence nulle en 1965" - https://en.wikipedia.org/wiki/Tony_Hoare
En ce qui concerne le monde réel, les deux peuvent être supposés identiques. C'est juste une syntaxe d'un langage de programmation qui crée une différence entre deux comme expliqué par d'autres ici. Cela crée simplement une surcharge comme lorsque vous vérifiez / comparez si la variable de chaîne a quelque chose, vous devez d'abord vérifier si ce n'est pas nul, puis la chaîne réelle en comparant, c'est-à-dire deux comparaisons. C'est un gaspillage de puissance de traitement pour chaque comparaison de chaînes.
Objects.equals () vérifie la valeur null avant d'appeler .equals ().
la source
comme une curiosité
la source