Quelle est la différence entre null
et le ""
(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 retournent false
. Il semble que je ne sois pas capable de trouver quelle est la différence entre eux.
"" est une chaîne réelle, bien que vide.
nULL, cependant, signifie que la variable String 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 pas égal à null, bien évidemment.
La différence est que, comme "" est une chaîne réelle, vous pouvez toujours invoquer des méthodes ou des fonctions comme
a.length()
a.substring(0, 1)
etc.
Si String est égal à null, comme b, Java lève un NullPointerException
si vous essayez d'appeler, dites:
b.length()
Si la différence sur laquelle vous vous posez la question est == versus égale, 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);
Cela donnerait la valeur false car j'avais alloué deux objets différents et les points a et b pointaient sur des objets différents.
Cependant, a.equals(b)
dans ce cas renverrait true, car equals
pour Strings renverra true si et seulement si l'argument String n'est pas null et représente la même séquence de caractères.
Soyez averti, cependant, que Java a un cas particulier pour Strings.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Vous penseriez que la sortie serait false
, car elle devrait allouer deux chaînes différentes. En fait, Java sera intern Chaînes littérales (celles initialisées comme a et b dans notre exemple). Alors faites attention, car cela peut donner des faux positifs sur le fonctionnement de ==.
String 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 telle que "aaa"
Voici un lien qui pourrait clarifier ce point http://download.Oracle.com/javase/tutorial/Java/concepts/object.html
Ce que vos déclarations vous disent, c'est simplement que "" n'est pas identique à null - ce qui est vrai. "" est une chaîne vide; null signifie qu'aucune valeur n'a été assignée.
Il serait peut-être plus instructif 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 utiles. null est une variable vide - il n'y a littéralement rien.
ici a is an Object
mais b(null)
est non un objet, il s'agit d'une référence nulle
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
voici ma réponse similaire
Il y a 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 de chaîne standard sont bien définies sur la chaîne vide - vous pouvez la convertir en minuscule, rechercher l'index d'un caractère, etc. La chaîne null null
est "aucune chaîne du tout". Il n'a pas de longueur car ce n'est pas du tout une chaîne. Si vous essayez d'appliquer une opération de chaîne standard à la chaîne null, un NullPointerException
sera généré au moment de l'exécution.
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.
En Java, un type de référence affecté à null
n'a aucune valeur . Une chaîne affectée ""
a une valeur: une chaîne vide, c'est-à-dire une chaîne ne contenant aucun caractère. Quand une variable est assignée null
, cela signifie qu’il n’ya aucun objet sous-jacent, que ce soit une chaîne ou autre.
String s = "";
s.length();
String s = null;
s.length();
Une référence à une chaîne vide ""
pointe vers un objet du segment de mémoire - vous pouvez donc appeler des méthodes dessus.
Mais une référence pointant sur null
n'a aucun objet à pointer dans le tas et vous obtiendrez donc une NullPointerException
.
"" et null les deux sont différents. le premier signifie que, dans le cadre de la déclaration de variable chaîne, la constante chaîne a été créée dans le pool de chaînes et que de la mémoire a été affectée à cet effet.
Mais lorsque nous le déclarons avec null , il vient juste d’être instancié jvm, mais aucune mémoire n’a été allouée pour cela. Par conséquent, si vous essayez d'accéder à cet objet en le cochant avec la variable "" - vierge, il ne peut pas empêcher nullpointerexception. Veuillez trouver ci-dessous un cas d'utilisation.
public class StringCheck {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "siddhartha";
String s2 = "";
String s3 = null;
System.out.println("length s1 ="+s1.length());
System.out.println("length s2 ="+s2.length());
//this piece of code will still throw nullpointerexception .
if(s3 != ""){
System.out.println("length s3 ="+s3.length());
}
}
}
La chaîne vide est distincte d'un référence nulle dans cela dans un langage de programmation orienté objet a référence null à un type de chaîne ne pointe pas vers un objet chaîne et provoquera une erreur si on essayait de effectuer une opération sur elle. Le vide string est toujours une chaîne sur laquelle Des opérations sur les chaînes peuvent être tentées.
De l'article de wikipedia sur chaîne vide .
Une chaîne peut être vide ou avoir une valeur null
. Si une chaîne est null
, elle ne fait référence à rien en mémoire. Essayez s.length()>0
. En effet, si une chaîne est vide, elle renvoie quand même une longueur de 0. Donc, si vous n'entrez rien pour la même chose, la boucle continuera quand même car elle n'enregistre pas la chaîne sous la forme null
. Alors que si vous vérifiez la longueur, il sortira de sa boucle.
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 nulle
String t="null";
Il s'agit d'un littéral de chaîne avec la chaîne de valeur "null" identique à t = "xyz". Il ne jettera pas le pointeur nul.
String u="";
C'est comme une chaîne vide, elle ne jettera pas le pointeur null.
Ce concept peut être mieux compris à partir des mathématiques. Avez-vous déjà essayé de diviser un nombre (pas zéro) par 0 en utilisant une calculatrice, par exemple 7/0? Vous obtiendrez un résultat qui ressemble à quelque chose comme ceci: undefined
, not a number
, null
etc. Cela signifie que l'opération est impossible, pour certaines raisons (laissez ces raisons pour qu'elles soient discutées 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 ne répondez que 0 car il ne reste rien après la division. Il y a une sortie valide et cette sortie est zéro.
Dans le premier exemple, non seulement la sortie était invalide, mais l'opération était impossible à exécuter. Cela ressemble à la chaîne null
en Java. Le deuxième exemple s'apparente à la chaîne empty
.
J'ai également observé que si une chaîne vide est une chaîne vide, elle contient toujours une adresse mémoire valide. Mais le pointeur NULL ne signalera rien.
https://shirleyanengineer.blogspot.com/2019/01/does-empty-string-has-address.html
Quand tu écris
String a = "";
Cela signifie qu'il existe une variable 'a' de type chaîne qui pointe vers une référence d'objet dans le pool de chaînes qui a une valeur "". Comme la 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 chaîne qui pointe vers une référence inconnue . Et toute opération sur une référence inconnue entraînera une NullPointerException
.
Maintenant, laissez-nous évaluer les expressions ci-dessous.
System.out.println(a == b); // false. because a and b both points to different object reference
System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.
System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed
En terme simple,
"" est un vide String
null est un vide String Variable.