¿Cuál es la diferencia entre null
y el""
(cadena vacía)?
He escrito un código simple:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Ambas declaraciones regresan false
. Parece que no puedo encontrar cuál es la diferencia real entre ellos.
b.equals(a)
, pero no lo use==
para comparar cadenas como "no funcionará" de otras maneras. Elnull
valor (que es diferente de una cadena vacía""
, una instancia de cadena válida) nunca puede tener un método invocado. Colocar el "no nulo conocido" (generalmente un valor constante o literal) al lado izquierdo de la igualdad es "Yoda condicionales" o algo así.Respuestas:
"" es una cadena real, aunque vacía.
nulo, sin embargo, significa que la variable String no apunta a nada.
a==b
devuelve falso porque "" y nulo no ocupan el mismo espacio en la memoria; en otras palabras, sus variables no apuntan a los mismos objetos.a.equals(b)
devuelve falso porque "" no es igual a nulo, obviamente.Sin embargo, la diferencia es que, dado que "" es una cadena real, aún puede invocar métodos o funciones como
a.length()
a.substring(0, 1)
y así.
Si la cadena es igual a nula, como b, Java arrojaría a
NullPointerException
si intentara invocar, diga:b.length()
Si la diferencia sobre la que se está preguntando es == versus igual, es esta:
== compara referencias, como si fuera
Eso daría como resultado falso porque asigné dos objetos diferentes, y a y b apuntan a objetos diferentes.
Sin embargo,
a.equals(b)
en este caso devolvería verdadero, porqueequals
para cadenas devolverá verdadero si y solo si el argumento Cadena no es nulo y representa la misma secuencia de caracteres.Sin embargo, tenga en cuenta que Java tiene un caso especial para Strings.
Se podría pensar que la salida sería
false
, ya que debería asignar dos cadenas diferentes. En realidad, Java internará cadenas literales (las que se inicializan como a y b en nuestro ejemplo). Así que tenga cuidado, porque eso puede dar algunos falsos positivos sobre cómo == funciona.fuente
intern
ha expirado. Puede consultar otro sitio para leer sobre él: weblogs.java.net/blog/enicholas/archive/2006/06/…String a = null
y luego la agrego como Cadenaa+= "example"
, cuando la imprimo, ¿por qué aparecenullexample
si nulo no es una Cadena?"num: " + 20
te da la cuerda"num: 20"
. ¿Esto significa que20
es una cadena? (No20
es , es un número). El mismo caso paranull
: no es una cadena, pero se puede convertir en una si intenta agregarla.También puede comprender la diferencia entre una cadena nula y una vacía de esta manera:
Imagen original de R. Sato ( @raysato )
fuente
La cadena es un objeto y puede ser nula
nulo significa que el objeto de cadena no fue instanciado
"" es un valor real de la Cadena de Objetos instanciada como "aaa"
Aquí hay un enlace que podría aclarar ese punto http://download.oracle.com/javase/tutorial/java/concepts/object.html
fuente
if (mp==null){do something}
.Lo que sus declaraciones le dicen es que "" no es lo mismo que nulo, lo cual es cierto. "" es una cadena vacía; nulo significa que no se ha asignado ningún valor.
Puede ser más esclarecedor intentarlo:
"" sigue siendo una cadena, lo que significa que puede llamar a sus métodos y obtener información significativa. nulo es una variable vacía, literalmente no hay nada allí.
fuente
Hay una diferencia bastante significativa entre los dos. La cadena vacía
""
es "la cadena que no tiene caracteres". Es una cadena real que tiene una longitud bien definida. Todas las operaciones de cadena estándar están bien definidas en la cadena vacía: puede convertirla a minúsculas, buscar el índice de algún carácter, etc. La cadena nulanull
"no es ninguna cadena". No tiene una longitud porque no es una cadena en absoluto. Intentar aplicar cualquier operación de cadena estándar a la cadena nula provocará unNullPointerException
tiempo de ejecución.fuente
aquí
a is an Object
pero nob(null)
es un objeto, es una referencia nulaAquí está mi respuesta similar
fuente
a
yb
son referencias.a
es una referencia con un objeto instanciado.b
es una referencia sin un objeto instanciado (de ahí el término "referencia nula").null
valor y la diferencia entre objetos y variables.nulo significa que el nombre no hace referencia a ningún objeto instanciado. "" significa una cadena vacía.
Aquí a está haciendo referencia a algún objeto que resulta ser una cadena vacía. b no hace referencia a ningún objeto ya que es nulo.
fuente
En Java, un tipo de referencia asignado no
null
tiene ningún valor . Una cadena asignada""
tiene un valor: una cadena vacía, es decir, una cadena sin caracteres. Cuando se asigna una variablenull
, significa que no hay ningún objeto subyacente de ningún tipo, cadena o de otro tipo.fuente
"" y nulo ambos son diferentes. el primero significa que, como parte de la declaración de variable de cadena, la constante de cadena se ha creado en el conjunto de cadenas y se ha asignado algo de memoria para la misma.
Pero cuando lo declaramos con nulo , se acaba de crear una instancia de jvm, pero no se le ha asignado memoria. por lo tanto, si está intentando acceder a este objeto verificándolo con "" - variable en blanco, no puede evitar la excepción nulopointerexception. A continuación encontrará un caso de uso.
}
fuente
Una referencia a una cadena vacía
""
apunta a un objeto en el montón, por lo que puede llamar a métodos en él.Pero una referencia que apunta a
null
no tiene ningún objeto para apuntar en el montón y, por lo tanto, obtendrá unNullPointerException
.fuente
Del artículo de Wikipedia en cadena vacía .
fuente
String s=null;
La cadena no se inicializa para nulo. si alguna operación de cadena lo intentó, puede arrojar una excepción de puntero nulo
String t="null";
Es una cadena literal con cadena de valor "nulo" igual que t = "xyz". No arrojará un puntero nulo.
String u="";
Es como una cadena vacía, no arrojará un puntero nulo.
fuente
Una cadena puede estar vacía o tener un
null
valor. Si una cadena esnull
, no se refiere a nada en la memoria. Tratars.length()>0
. Esto se debe a que si una cadena está vacía, aún devuelve una longitud de 0. Por lo tanto, si no ingresa nada para lo mismo, continuará en bucle ya que no registra la cadena comonull
. Mientras que si verifica la longitud, saldrá de su bucle.fuente
Este concepto se puede entender mejor desde las matemáticas. ¿Alguna vez ha intentado dividir un número (no cero) por 0 usando una calculadora, por ejemplo, 7/0? Obtendrá un resultado que se ve como algo presente:
undefined
,not a number
,null
etc. Esto significa que la operación no es posible, por algunas razones (vamos a dejar esas razones que se discutirán otro día).Ahora, realiza esto: 0/7. Obtendrá la salida, 0. Esto significa que la operación es posible y puede ejecutarse, pero la respuesta es solo 0 porque no queda nada después de la división. Hay una salida válida y esa salida es cero.
En el primer ejemplo, la salida no solo era inválida, sino que la operación no se podía ejecutar. Esto es similar a una
null
cadena en Java. El segundo ejemplo es similar a unaempty
cadena.fuente
Cuando escribes
String a = "";
Significa que hay una variable 'a' de tipo cadena que apunta a una referencia de objeto en el grupo de cadenas que tiene un valor "". Como la variable
a
contiene una referencia de objeto de cadena válida, todos los métodos de cadena se pueden aplicar aquí.Mientras que cuando escribes
String b = null;
Significa que hay una variable
b
de tipo cadena que apunta a una referencia desconocida . Y cualquier operación en referencia desconocida dará como resultado unNullPointerException
.Ahora, evaluemos las siguientes expresiones.
fuente
En términos simples,
"" es una cadena vacía
null es una variable de cadena vacía .
fuente
Diferencia entre cadena nula y vacía. Por ejemplo: tiene una variable llamada x. Si escribes en JS,
var x = "";
Esto significa que ha asignado un valor que es una cadena vacía (la longitud es 0). En realidad, esto es como algo, pero no se siente nada :) Por otro lado,
var y = null;
Esto significa que no le ha asignado un valor a y que dice claramente escribiendo nulo a y en el momento de la declaración. Si escribes y.length; arrojará un error que indica que ningún valor asignado a y, como resultado, no puede leer la longitud de y.
fuente
Esta imagen puede ayudarlo a comprender las diferencias.
La imagen fue recolectada de ProgrammerHumor
fuente
"Lo llamo mi error de mil millones de dólares. Fue la invención de la referencia nula en 1965" - https://en.wikipedia.org/wiki/Tony_Hoare
Con respecto al mundo real, ambos pueden suponerse lo mismo. Es solo una sintaxis de un lenguaje de programación que crea una diferencia entre dos como lo explican otros aquí. Esto simplemente crea una sobrecarga como cuando se verifica / compara si la variable de cadena tiene algo, primero debe verificar si no es nulo y luego comparar la cadena real, es decir, dos comparaciones. Esto es un desperdicio de poder de procesamiento para cada comparación de cadenas.
Objects.equals () busca nulos antes de llamar a .equals ().
fuente
como curiosidad
fuente