Différence entre la chaîne Java nulle et vide («»)


151

Quelle est la différence entre nullet 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.


6
Comparez avec b.equals(a)- mais ne l'utilisez pas ==pour la comparaison de chaînes car "cela ne fonctionnera pas" d'une autre manière. La nullvaleur (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:


220

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


Cela s'applique-t-il également à C #? Comme dans le tableau de "" est {'\ 0'}, un nul
Cole Johnson

3
Le lien about interna expiré. Vous pouvez vous référer à un autre site pour en savoir plus: weblogs.java.net/blog/enicholas/archive/2006/06/…
Alston

Donc, si j'ai une chaîne nulle String a = nullet que je lui ajoute une chaîne comme a+= "example", lorsque je l'imprime, pourquoi s'affiche nullexamplesi null n'est pas une chaîne?
cpinamtz

@PinaGamer JavaScript permet d'ajouter des non-chaînes aux chaînes. "num: " + 20vous donne la chaîne "num: 20". Cela signifie-t-il que 20c'est une chaîne? (ce n'est pas, 20c'est un nombre). Même cas pour null: ce n'est pas une chaîne, mais elle peut être convertie en une si vous essayez de l'ajouter.
daboross

@Zach L: quand String s = null + "a"; il donne la sortie nulla mais null.concat ("a") il donne l'exception de pointeur null. quelle est la raison dans mon premier cas nul + "a"; travaille.
Ved Prakash le

249

Vous pouvez également comprendre la différence entre null et une chaîne vide de cette façon:

Différence entre null et 0 / chaîne vide

Image originale de R. Sato ( @raysato )


7
C'est bien! J'expliquais nul vs vide à quelqu'un et je suis tombé sur votre réponse. Le concept a immédiatement cliqué pour eux.
matt.fc

14

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


"null signifie que l'objet String n'a pas été instancié" - merci! cela m'aide à comprendre beaucoup les choses. J'ai pu utiliser une instruction if sur un objet MediaPlayer une fois, et cela fonctionnait pour utiliser null, pour vérifier s'il était en cours d'exécution ou non (avec une méthode pour exécuter si c'était le cas), mais je n'ai jamais compris pourquoi cela fonctionnait, mais maintenant je vois ce qu'il disait, je vérifiais si MediaPlayer avait été instancié ou non, en utilisant null ... par exemple if (mp==null){do something}.
Azurespot

12

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:

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 ici.


9

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 nulle nullest "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 un NullPointerExceptionà l'exécution.


9

ici a is an Objectmais b(null)n'est pas un objet c'est une référence nulle

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

voici ma réponse similaire


1
Les deux aet bsont des références. aest une référence avec un objet instancié. best une référence sans objet instancié (d'où le terme «référence nulle»).
JUSTE MON OPINION correcte le

J'ai contre-agi le -1 ;-) Mais cela aiderait à clarifier cette réponse et à discuter de la différence entre "un objet" et la nullvaleur et la différence entre les objets et les variables.

@pst merci :) J'y ai répondu par cœur car voici ma autre réponse similaire à cette question stackoverflow.com/questions/4459623/…

8

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.


5

En Java, un type de référence attribué nulln'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, nullcela signifie qu'il n'y a aucun objet sous-jacent d'aucune sorte, chaîne ou autre.


4

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

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());
    }
}

}


4
String s = "";
s.length();

String s = null;
s.length();

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 fichier NullPointerException.


1

La chaîne vide est distincte d'une référence null en ce que dans un langage de programmation orienté objet, une référence null à un type chaîne ne pointe pas vers un objet chaîne et provoquera une erreur si l'on essaie d'effectuer une opération sur celui-ci. La chaîne vide est toujours une chaîne sur laquelle des opérations de chaîne peuvent être tentées.

De l'article wikipedia sur la chaîne vide .


1

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.


0

Une chaîne peut être vide ou avoir une nullvaleur. 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 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 sous null. Alors que si vous vérifiez la longueur, alors il sortira de sa boucle.


0

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, nulletc. 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 nullchaîne en java. Le deuxième exemple s'apparente à la emptychaîne.


0

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 variablea 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 bde 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.

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

0

En termes simples,

  • "" est une chaîne vide

  • null est une variable chaîne vide .


0

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 question est pour Java
Vega le


0

"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 ().


0

comme une curiosité

    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.